/ / Dziwna wydajność zapytań przy użyciu „max” - serwer SQL

Dziwna wydajność zapytań przy użyciu "max" - sql-server

Niedawno napotkaliśmy dziwny problem z wydajnością programu SQL Server 2008

Biorąc pod uwagę te dwa zapytania (które są równoważne)

select max(tfiv_value) from tablefieldintvalue where tfiv_fk_tablefield = 48

i

select max(tfiv_value) from tablefieldintvalue where tfiv_fk_tablefield =
(select tbfl_pk from tablefield where tbfl_name = "Field with pk 48")

Pierwszy trwa około 20 sekund, a drugi 0.

Aby wyczyścić podkwerendę

(select tbfl_pk from tablefield where tbfl_name = "Field with pk 48")

Ma w wyniku 48.

W planie zapytań widzimy, że przekształca ondrugie zapytanie do złączenia, ale to wciąż nie wyjaśnia mi, dlaczego tak się dzieje. Moim zdaniem, gdyby była różnica, pierwsza powinna być szybsza.

Mamy indeks we wszystkich odpowiednich polach.

Odpowiedzi:

1 dla odpowiedzi № 1

Moją pierwszą myślą jest jednak to, że pierwsze zapytanie wypełniło pamięć podręczną strony, a drugie po prostu z niej skorzystało. Buforowanie może mieć duże znaczenie.

Jeśli czasy są tak różne (i konsekwentnie)więc) dla dwóch zapytań, wyobrażam sobie, że różnica wynika ze skanowania tabeli w porównaniu z użyciem indeksu. Możesz to sprawdzić, przeglądając plany zapytań. Następne pytanie brzmi: „co by to spowodowało?”

Pierwsze zapytanie zwykle wykonuje skanowanie indeksu. . . chyba że jest wiele wierszy gdzie tfiv_fk_tablefield = 48. Jeśli tak uważa, to może zrobić tabelęskan zamiast skanowania indeksu. Oznacza to, że SQL Server ma „inteligentny” optymalizator, który uwzględnia statystyki. I może wybrać niewłaściwe podejście, gdy statystyki są nieaktualne.

Drugi może wymusić skanowanie indeksu, ponieważ używa pewnego rodzaju sprzężenia. W takim przypadku nieaktualne statystyki nie przyniosłyby efektu, a zapytanie działa poprawnie.

To oczywiście wszystko spekulacje. Powinieneś spojrzeć na plany zapytań i, jeśli to właściwe, dołączyć je do tego lub innego pytania.