SQL Server Statistics

SQL Server buduje statystyki opisujące przechowywane dane. Dzięki tym statystkom łatwiej jest wygenerować optymalny “execution plan”.  Jak wiemy,  plan wykonania zależy m.in. od stworzonych indeksów oraz przekazanych parametrów do danego zapytania\procedury.  Problem w tym, że bez wiedzy o konkretnych danych w bazie, trudno wygenerować optymalny plan. Jeśli wiemy, że zapytanie zwróci wszystkie wiersze, wtedy nie ma sensu korzystać z żadnych indeksów, ponieważ skanowanie będzie i tak szybsze.

Dzięki statystykom, SQL Server wie m.in. o dystrybucji i gęstości konkretnych danych\kolumn. Jeśli kolumna B ma jedną wartość we wszystkich wierszach, wtedy filtrowanie po niej nie jest zbyt selektywne. Takie informacje są bardzo przydatne w czasie tworzenia planu. W momencie, gdy wykonujemy jakiekolwiek zapytanie czy procedurę następuje kilka ważnych etapów:

  1. Zapytanie jest przekazane do SQL Server query optimizer.
  2. Jeśli plan zapytania istnieje w cache, wtedy po prostu jest zwracany.
  3. Tworzony jest nowy plan na podstawie dostępnych indeksów oraz typu przechowywanych danych.  To tutaj SQL Optimizer decyduje czy warto użyć indeksu czy lepsze może okazać się standardowe skanowanie. Jeśli optymizer zdecyduje się na użycie indeksu, wtedy musi również wybrać ten najbardziej optymalny.
  4. Nowo stworzony plan jest umieszczany w cache, wiec następne zapytania nie będą musiały być ponownie analizowane.

Do dyspozycji SQL Server ma dwie metryki, zagęszczenie danych oraz ich dystrybucję.

  • Gęstość  danych(Density)

Pierwszą zbieraną metryką jest zagęszczenie danych, czyli współczynnik pokazujący jak wiele unikalnych wartości jest w danej kolumnie. Można to opisać następującym wzorem:

Density of X = 1 / liczba unikalnych wartości w kolumnie X

Wysoka gęstość oznacza zatem, że jest tam mało unikalnych wartości, a co za tym idzie, zapytanie na takiej kolumnie będzie mało selektywne i nie ma sensu korzystać z indeksu.

  • Dystrybucja danych

Dystrybucja danych również opisuje zagęszczenie danych, ale pokazuje jakie konkretne dane występują najczęściej. Innymi słowy, dystrybucja danych to histogram. Dane są zatem dzielone na odpowiednie przedziały (oś X), a potem na osi Y mamy liczbę wystąpień znajdujących się w danym przedziale.   Jeśli w jakimś zapytaniu mamy “WHERE X> 200 AND X < 500, wtedy za pomocą dystrybucji można określić ile w przybliżeniu zapytanie zwróci wierszy. Jeśli histogram w tych przedziałach ma wysokie wartości, wtedy zapytanie jest bardzo selektywne, a co za tym idzie, indeks jest dobrym rozwiązaniem.

W SQL Server występuje 200 wspomnianych przedziałów. Trochę upraszczam tutaj, bo SQL Server przechowuje kilka innych wartości histogramu, ale główną ideą jest posiadanie opisu gęstości konkretnych przedziałów danych.

Kiedy są zatem tworzone statystyki? Domyślnie są tworzone dla indeksów, w tym klucza głównego (clustered index). Jeśli AUTO_CREATE_STATISTICS jest uaktywnione na bazie, wtedy również będą tworzone dla kolumn w zapytaniach, które używane są do filtrowania danych (klauzula WHERE, JOIN).

W następnym wpisie przyjrzyjmy się jak obejrzeć powyższe statystyki w SQL Server.

Leave a Reply

Your email address will not be published.