Emilia Mazurkiewicz

Emilia Mazurkiewicz Specjalista ds.
Wsparcia i
Utrzymania Systemów
Informatyc...

Temat: pomoc w optymalizacji zapytania MSSQL

Jak zapisać poniższe zapytanie w uproszczonej wersji, żeby działało optymalnie.
SELECT o.id_testu, o.pub_int_od, p.tk AS stanowisko, p3.tu AS jednostka, ox.id_testu AS lk, ox1.id_testu AS wn, ox2.id_testu AS nd, o.jozus_wprow AS jozus_utw,
o.priorytet
FROM dbo.TEST AS o LEFT OUTER JOIN
dbo.POLA AS px ON px.id = o.id_testu AND px.id_definicji_pola = 143 LEFT OUTER JOIN
dbo.TEST AS ox ON ox.id_testu = px.id_testu AND ox.data_pub IS NOT NULL AND ox.pub_int_od < GETDATE() LEFT OUTER JOIN
dbo.POLA AS px1 ON px1.id = o.id_testu AND px1.id_definicji_pola = 138 LEFT OUTER JOIN
dbo.TEST AS ox1 ON ox1.id_testu = px1.id_testu AND ox1.data_pub IS NOT NULL AND ox1.pub_int_od < GETDATE() LEFT OUTER JOIN
dbo.POLA AS px2 ON px2.id = o.id_testu AND px2.id_definicji_pola = 147 LEFT OUTER JOIN
dbo.TEST AS ox2 ON ox2.id_testu = px2.id_testu AND ox2.data_pub IS NOT NULL AND ox2.pub_int_od < GETDATE() INNER JOIN
dbo.POLA AS p ON p.id_testu = o.id_testu AND p.id_definicji_pola = 129 INNER JOIN
dbo.POLA AS p3 ON p3.id_testu = o.id_testu AND p3.id_definicji_pola = 127
WHERE (ox1.pub_int_do > GETDATE()) AND (o.id_typu_testu = 8) AND (o.czy_gotowe = 1) AND (o.data_apr IS NOT NULL) AND (o.data_superapr IS NOT NULL) AND
(o.data_pub IS NOT NULL) AND (o.pub_int_od < GETDATE()) OR
(o.id_typu_testu = 8) AND (o.czy_gotowe = 1) AND (o.data_apr IS NOT NULL) AND (o.data_superapr IS NOT NULL) AND (o.data_pub IS NOT NULL) AND
(o.pub_int_od < GETDATE()) AND (ox1.data_pub IS NULL) OR
(ox1.pub_int_do < GETDATE()) AND (o.id_typu_testu = 8) AND (o.czy_gotowe = 1) AND (o.data_apr IS NOT NULL) AND (o.data_superapr IS NOT NULL) AND
(o.data_pub IS NOT NULL) AND (o.pub_int_od < GETDATE()) AND (ox2.pub_int_do > GETDATE()) AND (ox2.data_pub IS NOT NULL)
Paweł B.

Paweł B. architekt baz danych
/ SQL Developer /BI
Developer

Temat: pomoc w optymalizacji zapytania MSSQL

Na początek zrób porządek z warunkami po WHERE, bo
warunek1 AND warunek2 OR warunek1 AND warunek3
to nie to samo, co (warunek1 AND warunek2) OR (warunek1 AND warunek3)

<code>(o.id_typu_testu = 8) AND (o.czy_gotowe = 1) AND (o.data_apr IS NOT NULL) AND (o.data_superapr IS NOT NULL)</code> masz 3 razy
Paweł Broda

Paweł Broda Software Engineer

Temat: pomoc w optymalizacji zapytania MSSQL

Paweł B.:
Na początek zrób porządek z warunkami po WHERE, bo
warunek1 AND warunek2 OR warunek1 AND warunek3
to nie to samo, co (warunek1 AND warunek2) OR (warunek1 AND warunek3)

akurat to to samo ;) operator AND ma wyższy priorytet niż OR (przynajmniej w Oracle i MSSQL)
Paweł B.

Paweł B. architekt baz danych
/ SQL Developer /BI
Developer

Temat: pomoc w optymalizacji zapytania MSSQL

Oczywiści masz rację, wynik jest identyczny, ale przy tak długiej treści klauzuli można oczopląsów dostać. Może się czepiam, ale dla mnie nawiasy i wcięcia porządkują kod.
W każdym razie chodzi o to, że jak warunki są w tej samej kolejności i w nawiasach to od razu widać, że niektóre z nich można "wyciągnąć przed nawias" czyli
((o.id_typu_testu = 8) AND (o.czy_gotowe = 1) AND (o.data_apr IS NOT NULL) AND (o.data_superapr IS NOT NULL))
AND (
(cośtam and cośtam1) OR (cośtam2 and cośtam2)
)
Tomasz Serwański

Tomasz Serwański Microsoft Dynamics
CRM - konsultant
biznesowy

Temat: pomoc w optymalizacji zapytania MSSQL

Emilia M.:
wprost nie odpowiem, odpowiedz chyba zawsze zlazy od otoczenia; ale:
- jezeli to cwiczenie na uczelnie to nie chce mi sie zastanawiac :)
- jezeli do pracy i zapytanie ma byc wykonywane regularnie (czesc raportu czy cos) i musi bazowac na danych biezacych/aktualnych - to zobaczylbym jak wyglada execution plan dla tego zapytania
- a z cyklu tips&tricks - jezeli zapytanie jest wywolywane bardzo czesto i dotyczy czesto uzywanego raportu/kwerendy prezentujacej dane nie 'na zywo' ale takie gdzie pewne opoznienie jest akceptowalne, to rozwazylbym wykonanie zapytania raz, zapisanie wyniku w tabeli, i odpytywanie pozniej tabeli wynikowej, a nie wywolywanie tego samego zapytania szereg razy
Adam Stawiński

Adam Stawiński Programista SQL,
specjalista ds.
optymalizacji kodu
MS SQL

Temat: pomoc w optymalizacji zapytania MSSQL

CREATE INDEX IX_POLA_id ON dbo.POLA(id, id_definicji_pola)
CREATE INDEX IX_POLA_id_testu ON dbo.POLA(id_testu, id_definicji_pola)
CREATE INDEX IX_TEST_id_testu ON dbo.TEST(id_testu)

Następna dyskusja:

pomoc w optymalizacji zapyt...




Wyślij zaproszenie do