Możesz użyć jednego z tych dwóch zapytań, aby zobaczyć całkowitą liczbę odczytów logicznych i całkowitą liczbę odczytów fizycznych.
SELECT DB_NAME(st.dbid) Db,
OBJECT_NAME(st.objectid, st.dbid) Prc,
qs.execution_count,
qs.total_logical_reads,
qs.total_physical_reads,
qs.statement_start_offset,
qs.statement_end_offset,
st.text
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st;
SELECT DB_NAME(database_id) Db,
OBJECT_NAME(object_id, database_id) Prc,
execution_count,
total_logical_reads,
total_physical_reads
FROM sys.dm_exec_procedure_stats ps;
Pierwszy rozkłada to według instrukcji, drugi liczy się w całej procedurze.
Odczyty fizyczne są odczytywane względem dysku, odczyty logiczne są przeciw pamięci. Możesz użyć tego, aby dowiedzieć się, które procedury lub instrukcje są najdroższe w twoim systemie i spróbować je dostroić.
Należy pamiętać, że chociaż odczyty logiczne są znacznie tańsze niż odczyty fizyczne, wciąż są drogie, więc zmniejszenie ich liczby (na przykład poprzez dodanie odpowiedniego indeksu) może znacznie przyspieszyć zapytania.
Istnieje wiele dodatkowych kolumn w powyższych DMV, które również mogą Cię zainteresować.
W jaki sposób indeks pomaga zredukować logiczne odczyty?
W SQL Server wszystkie dane są zorganizowane w bloki o wielkości 8 KB. Te bloki nazywane są „stronami”.
Każda tabela zawiera strony „meta”, które zawierają informacje o strukturach tabeli, a także strony pata. Jeśli nie istnieje indeks i uruchomisz zapytanie, takie jak SELECT * FROM tbl WHERE Id = 7
SQL Server musi szukać tego lub tych wierszy w całej tabeli. Czyta więc po jednej stronie na raz, zapętla wszystkie wiersze na każdej stronie, aby ustalić, które wiersze pasują do WHERE
klauzuli. Jeśli więc tabela wymaga przechowywania 1 000 000 stron, to zapytanie wykona 1 000 000 logicznych odczytów.
Jeśli masz indeks, SQL Server sortuje dane logicznie na stronach i ustanawia połączoną listę między stronami. Pozwala to na uruchamianie zapytań ORDER BY
do wykonania bez kosztownej operacji sortowania. Ale co ważne, podczas sortowania SQL Server dodaje drzewo B + do tabeli. Drzewo B + to struktura porównywalna z indeksem w książce, w której wyszukiwanie określonego słowa kluczowego pozwala mi bezpośrednio przejść do strony zawierającej słowo kluczowe. Typowa książka ma tylko jeden poziom indeksu, podczas gdy drzewo B + może mieć wiele. Pomyśl tylko o dużej książce, w której sam indeks ma wiele stron. W takim przypadku ma sens dodanie dodatkowej warstwy indeksu, która mówi nam, na której stronie S
można znaleźć słowa indeksu zaczynające się.
Drzewa B + są zoptymalizowane pod kątem jak najmniejszej liczby poziomów, zapewniając jednocześnie właściwość, że dowolny rekord w indeksie można znaleźć, czytając jedną stronę na poziom indeksu. Więc załóż powyższe WHERE Id = 7
zapytanie, gdy masz posortowany indeks Id
. Powiedzmy, że indeks ma 5 poziomów. Teraz, aby znaleźć wszystkie rekordy pasujące do tego zapytania, muszę przeczytać jedną stronę na poziom indeksu (czyli 5 stron). Nazywa się to „Wyszukiwanie indeksu”. Jeśli istnieje wiele rekordów pasujących do rachunku, być może będę musiał przez jakiś czas śledzić posortowany indeks, aby odzyskać wszystkie. Załóżmy jednak, że jest tylko jeden rekord.
Tak więc bez uruchamiania indeksu to zapytanie wymagało 1 000 000 odczytów, a indes wymagało 5 odczytów. Mimo że odczyt logiczny jest operacją w pamięci, nadal istnieje znaczny koszt - w rzeczywistości jest to najdroższa operacja w tak trywialnym zapytaniu, jak powyższe. Zatem zmniejszenie liczby logicznych odczytów wymaganych o współczynnik 200 000 przyspieszy zapytanie o podobny współczynnik.
Czytanie logiczne nie jest więc równoważne skanowaniu tabeli, ale skanowanie tabeli powoduje o wiele więcej logicznych odczytów niż wyszukiwanie indeksu.