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

24
Оптимизация SQL Михаил Гуренков 17 октября 2008 г. Клуб Маинфо.ру

Upload: constantin-kichinsky

Post on 17-Jun-2015

728 views

Category:

Technology


4 download

DESCRIPTION

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

TRANSCRIPT

Page 1: Оптимизация SQL

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

17 октября 2008 г. Клуб Маинфо.ру

Page 2: Оптимизация SQL

Упрощение схемы данных

Page 3: Оптимизация SQL

Неявное соединение → ...

select *from xCompaniesToCategories cc, xCompanies c, xCompanyProperties p, xPersons pe, #addresses aj, #addresses af, xCompaniesToPersons ctp, xContracts cowhere 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

Page 4: Оптимизация SQL

... → Явное соединение

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.idwhere id_Category = 30

Page 5: Оптимизация SQL

Типовые запросы → представления

select * from OrderServices s join Orders o on s.id_Order = o.idwhere id_Company = 1234 ↓ select * from vOrderServices where id_Company = 1234

Page 6: Оптимизация SQL

Инкапсуляция запросовcreate view vOrderServiceHistory asselect 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

Page 7: Оптимизация SQL

Рефакторинг базы данных

Page 8: Оптимизация SQL

Использование индексов

Page 9: Оптимизация SQL

Оптимизаторы

Rule-based (RBO)Cost-based (CBO)

Page 10: Оптимизация SQL

Денормализация данных

Page 11: Оптимизация SQL

Составные тэги

ЦСКА (баскетболл, муж)

↓ «ЦСКА (баскетболл, муж)», «баскетболл», «муж»

Page 12: Оптимизация SQL

SQL и процедурный стиль программирования

Page 13: Оптимизация SQL

Новости по теме

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.idwhere news.id != ?order by publishing_date desc

Page 14: Оптимизация SQL

Публикация прайс-листа

Page 15: Оптимизация SQL

Функции

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

Page 16: Оптимизация SQL

В заключение

Page 17: Оптимизация SQL

Главные мысли

1. Забота о схеме данных2. Правильное использование индексов 3. SQL — не язык программирования

Page 18: Оптимизация SQL

Мартин Грабер«SQL»

Page 19: Оптимизация SQL

Джо Селко«SQL для профессионалов»

Page 20: Оптимизация SQL

«Рефакторинг баз данных»

Скотт Эмблер, Прамод Садаладж

Page 21: Оптимизация SQL

Ссылки

1. www.sql.ru2. msdn.microsoft.com3. dev.mysql.com/doc/refman/5.1/en/optimization.html 4. community.livejournal.com/ru_mysql/ 5. ...

Page 22: Оптимизация SQL

www.dreamspark.ru

Page 23: Оптимизация SQL

Контакты

[email protected] www.gurenkov.net

Page 24: Оптимизация SQL

SQL has been optimized :)