Norbert M.

Norbert M. Nobody's perfect.
Call me Nobody ;)

Temat: Optymalizacja prostego zapytania

Witam. Chciałby zoptymalizować zapytanie, które wykonuje mi się dosyć długo. Mam dwie tabele jedna dla produktów, druga dla kwot związanymi z tymi produktami. Połączone jeden do wielu. Jednemu produktowi odpowiada pięć kwot (A,B,C,D,E). Chciałby teraz zrobić zapytanie, które w jednym wierszu przedstawi produkt oraz jego pięć kwot. Robię sobie podzapytania, mniej więcej tak:

SELECT PrID, PrNazwa,

(SELECT TOP 1 KwKwota FROM KwTable WHERE (KwPrID = PrTable.PrID) AND (KwTyp = 'A')) AS KwotaA,
(SELECT TOP 1 KwKwota FROM KwTable AS KwTable_1 WHERE (KwPrID = PrTable.PrID) AND (KwTyp = 'B')) AS KwotaB,
(SELECT TOP 1 KwKwota FROM KwTable AS KwTable_2 WHERE (KwPrID = PrTable.PrID) AND (KwTyp = 'C')) AS KwotaC,
(SELECT TOP 1 KwKwota FROM KwTable AS KwTable_3 WHERE (KwPrID = PrTable.PrID) AND (KwTyp = 'D')) AS KwotaD,
(SELECT TOP 1 KwKwota FROM KwTable AS KwTable_4 WHERE (KwPrID = PrTable.PrID) AND (KwTyp = 'E')) AS KwotaE
FROM PrTable


Oczywiście zapytanie działa poprawnie, ale niezmiernie wolno, a jak dodam dodatkowe warunki to już w ogóle potrafi się wywalić. Czy jest inny sposób, żeby przy takiej strukturze bazy osiągnąć taki sam efekt?
PozdrawiamNorbert Maziarz edytował(a) ten post dnia 21.01.09 o godzinie 21:52
Paweł B.

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

Temat: Optymalizacja prostego zapytania

Spróbuj tak:
Select P.PrId, P.PrNazwa
, A.KwKwota as KwotaA
, B.KwKwota as KwotaB
, C.KwKwota as KwotaC
, D.KwKwota as KwotaD
, E.KwKwota as KwotaE
from PrTable P
left join KwTabele A on A.KwPrID =P.PrId and A.KwTyp = 'A'
left join KwTabele B on B.KwPrID =P.PrId and A.KwTyp = 'B'
left join KwTabele C on C.KwPrID =P.PrId and A.KwTyp = 'C'
left join KwTabele D on C.KwPrID =P.PrId and A.KwTyp = 'D'
left join KwTabele E on C.KwPrID =P.PrId and A.KwTyp = 'E'
Miłosław O.

Miłosław O. życie to nie bajka,
to bitwa

Temat: Optymalizacja prostego zapytania

Można skorzystać z wyrażenia PIVOT, przykłady jak to zrobić można znaleźć w helpie. Jeśli problem jest z wydajnością to może brakuje indeksów?
Norbert M.

Norbert M. Nobody's perfect.
Call me Nobody ;)

Temat: Optymalizacja prostego zapytania

Dziękuję Panowie. Sprawdzę oba rozwiązania.
Pozdrawiam.
Arkadiusz O.

Arkadiusz O. Administrator
systemów kasowych,
Exorigo

Temat: Optymalizacja prostego zapytania

Albo na "leniwca" ;) jeśli to SQL 2005 zobaczyć co powie Database Engine Tuning Advisor

Następna dyskusja:

Optymalizacja zapytania




Wyślij zaproszenie do