Witam.
Czy na podstawie tego planu możecie podpowiedzieć co można zrobić aby zapytanie działało szybciej?
W tej chwili wykonuje się ok do 10 sekund....
Witam.
Czy na podstawie tego planu możecie podpowiedzieć co można zrobić aby zapytanie działało szybciej?
W tej chwili wykonuje się ok do 10 sekund....
dodać lepszy index na tabeli pozycja
Kombinując zauważyłem coś takiego;
w zapytanieu oryginalnie jest taki warunek:
WHERE
CASE WHEN DoId IS NULL THEN Id ELSE DoId END = 34202133
zamieniłem go na sumę warunków:
WHERE ((DoId IS NOT NULL AND DoId = 34202133) OR (DoId IS NULL AND Id = 34202133))
i zapytanie działa dużo szybciej.
Czy możecie mi potwierdzić że wynik zapytania będzie taki sam i że rzeczywiście taka konstrukcja powinna być szybsza?
Negacja nie jest optymalizowana, mozesz to zapisać tak:
isNull(DoId,Id) = 34202133
Przetestowałem zapytanie z dwoma wersjami warunków
isNull(DoId,Id) = 34202133
czas wykonania 1-2 s
oraz
WHERE ((DoId IS NOT NULL AND DoId = 34202133) OR (DoId IS NULL AND Id = 34202133))
biorąc pod uwage komentarz @abrakadaber zminiłem na :
WHERE ((DoId = 34202133) OR (DoId IS NULL AND Id = 34202133))
czas wykonania: ułamek sekundy
Pytanie czy są jednoznaczne (wydaje mi się, że tak ale wolę się upewnić)?
możesz też założyć indeks funkcyjny na isNull(DoId,Id)
. Oczywiście jeśli szukasz po innych polach to je też by wypadało dodać do indeksu. Pamiętaj też, że jak masz warunek na kilku polach to indeks musi być jedne na tych polach a nie na każdym osobno. Ma też znaczenie kolejność pól w indeksie
Czy jest sytuacja, że DoId IS NOT NULL i DoId<>34202133 i Id=34202133 ? Jeśli nie, to możesz jeszcze spróbować "34202133 IN (DoId, Id)"
Patrząc na plan wykonania to wersja z OR jest szybsza bo masz tam seek, zamiast scan indeksu, pewnie masz indeksy na tych kolumnach