wydajność zapytania SQL
w tym konkretnym przypadku nie zauważysz ogromnej różnicy, ponieważ 30 000 wierszy nie jest zbyt trudne do przetworzenia w bazie danych. Jeśli jednak mówisz o setkach milionów wierszy lub więcej, zauważysz zauważalną poprawę poprzez agregację przed dołączeniem. Gdy to zrobisz, upewnij się, że to, co robisz, jest logicznie spójne — powinieneś martwić się o dokładność swojej pracy, zanim zaczniesz martwić się o prędkość biegu.
13 porad dotyczących wydajności zapytań
pamiętaj o prefiksie nazw obiektów (np. tabela, procedura składowana, widok) z nazwą właściciela / schematu.
powód: jeśli nazwa właściciela/schematu nie jest podana, silnik serwera SQL próbuje ją znaleźć we wszystkich schematach, dopóki obiekt jej nie znajdzie. Silnik SQL Server nie będzie szukał tabeli poza jego właścicielem / schematem, jeśli podana jest nazwa właściciela/schematu.
Operator *
nie używaj operatora * w poleceniach SELECT. Zamiast tego użyj nazw kolumn.
powód: SQL Server skanuje wszystkie nazwy kolumn i zastępuje * wszystkimi nazwami kolumn tabeli w instrukcji SQL SELECT. Podanie nazw kolumn pozwala uniknąć tego wyszukiwania i zastępowania oraz zwiększa wydajność.
Nullable Columns
Unikaj używania NOT IN w porównaniu z kolumnami nullable. Zamiast tego Use nie istnieje.
powód: gdy w zapytaniu jest używane NOT IN (nawet jeśli zapytanie nie zwraca wierszy z wartościami null), SQL Server sprawdzi każdy wynik, aby sprawdzić, czy jest to null, czy nie. Użycie NOT EXISTS nie spowoduje porównania z wartościami null. Ponadto NOT EXISTS zwraca tylko dwa stany (true lub false), podczas gdy NOT IN może zwrócić do trzech stanów (true, false, NULL) i może nie dać oczekiwanego wyniku.
zmienne tabel i połączenia
Unikaj używania zmiennych tabel w połączeniach. Zamiast tego użyj tabel tymczasowych, CTE (Common Table Expressions) lub tabel pochodnych w połączeniach.
powód: mimo że zmienne tabelkowe są bardzo szybkie i wydajne w wielu sytuacjach, silnik SQL Server widzi je jako pojedynczy wiersz. Z tego powodu SQL stworzy plan wykonania, który będzie działał okropnie, gdy będzie używany w połączeniach.
nazwy procedur składowanych
nie rozpoczynają nazwy procedury składowanej od sp_.
powód: gdy procedura składowana ma nazwę sp_ lub SP_, SQL Server zawsze sprawdza w bazie danych system / master, nawet jeśli podano nazwę właściciela / schematu. Podanie nazwy bez SP_ do procedury składowanej pozwala uniknąć niepotrzebnego sprawdzania w bazie danych system / master w SQL Server.
użyj SET NOCOUNT ON
użyj SET NOCOUNT ON z operacjami DML.
powód: podczas wykonywania operacji DML (tj. INSERT, DELETE, SELECT I UPDATE), SQL Server zawsze zwraca liczbę wierszy, których to dotyczy. W złożonych zapytaniach z wieloma połączeniami staje się to ogromnym problemem wydajności. Użycie SET NOCOUNT ON poprawi wydajność, ponieważ nie będzie śledzić liczby wierszy, których to dotyczy.
Unikaj używania GROUP BY, ORDER BY i DISTINCT
w miarę możliwości unikaj używania GROUP BY, ORDER BY i DISTINCT.
powód: podczas używania GROUP BY, ORDER BY lub DISTINCT silnik SQL Server tworzy tabelę roboczą i umieszcza dane na tabeli roboczej. Następnie porządkuje te dane w tabeli roboczej zgodnie z żądaniem zapytania, a następnie zwraca wynik końcowy.
Sprawdź indeksy
we wszystkich polach używanych w części WHERE I JOIN instrukcji SQL powinny znajdować się indeksy.
powód: gdy pola nie są indeksowane, SQL Server zazwyczaj wykonuje pełne skanowanie tabeli, co może zmniejszyć wydajność. O ile tabela nie jest bardzo mała, skanowanie tabeli ma tendencję do uzyskiwania najgorszej wydajności spośród wszystkich typów odczytów bazy danych.
Użyj tego samego typu danych w klauzulach JOIN i WHERE
jest to łatwiejsze do powiedzenia niż do zrobienia w zależności od Twoich uprawnień do wprowadzania zmian w schemacie.
powód: podczas łączenia lub porównywania dwóch pól z różnymi typami danych, SQL musi przeprowadzić konwersję pola w locie, zanim będzie mógł dokonać porównania, nawet jeśli pola są indeksowane. Jeśli niedopasowane typy danych są nieuniknione, spróbuj w miarę możliwości przerzucić większy typ danych na mniejszy.
Unikaj używania pól obliczeniowych w klauzulach JOIN i WHERE
można to zrobić, tworząc pole z obliczonymi wartościami używanymi w tabeli join. Patrz poniżej.