Optymalizacja zapytania.

0

Witam.

Czy na podstawie tego planu możecie podpowiedzieć co można zrobić aby zapytanie działało szybciej?

screenshot-20170117075604.png

W tej chwili wykonuje się ok do 10 sekund....

2

dodać lepszy index na tabeli pozycja

0

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?

0

Negacja nie jest optymalizowana, mozesz to zapisać tak:

isNull(DoId,Id) = 34202133
0

Przetestowałem zapytanie z dwoma wersjami warunków

isNull(DoId,Id) = 34202133 

czas wykonania 1-2 s

screenshot-20170117100336.png

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

screenshot-20170117100241.png

Pytanie czy są jednoznaczne (wydaje mi się, że tak ale wolę się upewnić)?

0

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

0

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)"

0

Patrząc na plan wykonania to wersja z OR jest szybsza bo masz tam seek, zamiast scan indeksu, pewnie masz indeksy na tych kolumnach

1 użytkowników online, w tym zalogowanych: 0, gości: 1