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.

Leave a Reply

Twój adres e-mail nie zostanie opublikowany.