0
Оптимизация SQL
       Михаил Гуренков




     17 октября 2008 г. Клуб Маинфо.ру
Упрощение схемы данных
Неявное соединение → ...

select *
from
   xCompaniesToCategories cc, xCompanies c,
   xCompanyProperties p, xPersons pe, ...
... → Явное соединение

select *
from xCompanies c
   join xCompaniesToCategories cc on c.id = cc.id_Company
   join xComp...
Типовые запросы → представления

select *
from OrderServices s
   join Orders o on s.id_Order = o.id
where id_Company = 12...
Инкапсуляция запросов
create view vOrderServiceHistory as
select os1.*, os1.AffectedDate DateOn, os2.AffectedDate DateOff,...
Рефакторинг базы данных
Использование индексов
Оптимизаторы

Rule-based (RBO)
Cost-based (CBO)
Денормализация данных
Составные тэги


              ЦСКА (баскетболл, муж)
                        ↓
   «ЦСКА (баскетболл, муж)», «баскетболл»,...
SQL и процедурный стиль
   программирования
Новости по теме

select news.* from news
  join (
     select distinct n.id from news n
     join taggings t1 on t1.news_i...
Публикация прайс-листа
Функции

select
   id, dbo.GetServiceAbonPrice(id, getdate()) as AbonPrice
from vOrderServices

select id, abon.Price
from...
В заключение
Главные мысли

1. Забота о схеме данных
2. Правильное использование индексов
3. SQL — не язык программирования
Мартин Грабер
«SQL»
Джо Селко
«SQL для профессионалов»
Скотт Эмблер,
 Прамод Садаладж
«Рефакторинг баз данных»
Ссылки

1.   www.sql.ru
2.   msdn.microsoft.com
3.   dev.mysql.com/doc/refman/5.1/en/optimization.html
4.   community.live...
www.dreamspark.ru
Контакты


           michael@gurenkov.net
               www.gurenkov.net
SQL has been optimized :)
Upcoming SlideShare
Loading in...5
×

Оптимизация SQL

707

Published on

Оптимизаций SQL, Михаил Гуренков, Клуб MAInfo.ru

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
707
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
15
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Transcript of "Оптимизация SQL"

  1. 1. Оптимизация SQL Михаил Гуренков 17 октября 2008 г. Клуб Маинфо.ру
  2. 2. Упрощение схемы данных
  3. 3. Неявное соединение → ... select * from xCompaniesToCategories cc, xCompanies c, xCompanyProperties p, xPersons pe, #addresses aj, #addresses af, xCompaniesToPersons ctp, xContracts co where p.id_Company = c.id and pe.id = id_Chief and aj.id = id_DejuroAddress and af.id = id_DefactoAddress and ctp.id_Company = c.id and ctp.id_Person = pe.id and co.id_Company = c.id and c.id = cc.id_Company and id_Category = 30 and p.id_Company = c.id
  4. 4. ... → Явное соединение select * from xCompanies c join xCompaniesToCategories cc on c.id = cc.id_Company join xCompanyProperties p on p.id_Company = c.id join xPersons pe on pe.id = id_Chief join #addresses aj on aj.id = id_DejuroAddress join #addresses af on af.id = id_DefactoAddress join xCompaniesToPersons ctp on ctp.id_Company = c.id and ctp.id_Person = pe.id join xContracts co on co.id_Company = c.id where id_Category = 30
  5. 5. Типовые запросы → представления select * from OrderServices s join Orders o on s.id_Order = o.id where id_Company = 1234 ↓ select * from vOrderServices where id_Company = 1234
  6. 6. Инкапсуляция запросов create view vOrderServiceHistory as select os1.*, os1.AffectedDate DateOn, os2.AffectedDate DateOff, os2.id_Order id_OrderOff from vOrderServices os1 left join vOrderServices os2 on (os1.id_Company = os2. id_Company and os1.id_Resource = os2.id_Resource and os2. ServiceHash = os1.ServiceHash and os2.Rang < os1.Rang and os2.Action = -1) and not exists (select * from vOrderServices os3 where os1. id_Company = os3.id_Company and os1.id_Resource = os3. id_Resource and os3.ServiceHash = os1.ServiceHash and os3. Rang > os2.Rang and os3.Rang < os1.Rang and os3.Action = -1) where os1.OrderTypeAction = 1
  7. 7. Рефакторинг базы данных
  8. 8. Использование индексов
  9. 9. Оптимизаторы Rule-based (RBO) Cost-based (CBO)
  10. 10. Денормализация данных
  11. 11. Составные тэги ЦСКА (баскетболл, муж) ↓ «ЦСКА (баскетболл, муж)», «баскетболл», «муж»
  12. 12. SQL и процедурный стиль программирования
  13. 13. Новости по теме select news.* from news join ( select distinct n.id from news n join taggings t1 on t1.news_id = ? join taggings t2 on t2.news_id = ? and t1.id_tag > t2.id_tag join taggings r1 on t1.tag_id = r1.tag_id and r1.news_id = n.id join taggings r2 on t2.tag_id = r2.tag_id and r2.news_id = n.id ) related on news.id = related.id where news.id != ? order by publishing_date desc
  14. 14. Публикация прайс-листа
  15. 15. Функции select id, dbo.GetServiceAbonPrice(id, getdate()) as AbonPrice from vOrderServices select id, abon.Price from vOrderServices os join dbo.GetAbonPrices() as abon on abon.ServiceHash = os.ServiceHash and abon.id_Company = os.id_Company
  16. 16. В заключение
  17. 17. Главные мысли 1. Забота о схеме данных 2. Правильное использование индексов 3. SQL — не язык программирования
  18. 18. Мартин Грабер «SQL»
  19. 19. Джо Селко «SQL для профессионалов»
  20. 20. Скотт Эмблер, Прамод Садаладж «Рефакторинг баз данных»
  21. 21. Ссылки 1. www.sql.ru 2. msdn.microsoft.com 3. dev.mysql.com/doc/refman/5.1/en/optimization.html 4. community.livejournal.com/ru_mysql/ 5. ...
  22. 22. www.dreamspark.ru
  23. 23. Контакты michael@gurenkov.net www.gurenkov.net
  24. 24. SQL has been optimized :)
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×