Indexy i Statystyki [MS SQL]

0

Witajcie,

Mam pytanie odnośnie Indexów i Statystyk na bazie MS SQL.
Mam table w której utworzyłem nonclustered index po kolumnach [1],[2],[3]
np :

CREATE NONCLUSTERED INDEX [NCIX_TABLE] ON [dbo].[TABLE]
(
[1] ASC,[2] ASC,[3] ASC
)

Wraz z utworzeniem index'u MS SQL tworzy sobie statystykę pod wskazany index
CREATE STATISTICS INDEX [NCIX_TABLE] ON [dbo].[TABLE]
(
[1],[2],[3]
)

Moje pytanie brzmi czy jeżeli utworze dodatkowe statystyki to może lub podniesie to wydajność zapytań wyszukujących po zbiorach [2] , [3] ?:

CREATE STATISTICS INDEX [NCIX_TABLE2] ON [dbo].[TABLE]
(
[2],[3],[1]
)

CREATE STATISTICS INDEX [NCIX_TABLE3 ON [dbo].[TABLE]
(
[3],[1],[2]
)

1

W 99% procent przypadkach jeśli baza użyje tego indeksu, to użyje również statystyk które powstały razem z tym indeksem.
Nawet jeśli ten indeks będzie użyty do wyszukiwania po zbiorze [2], to to będzie INDEX SCAN, a nie INDEX SEEK, bo będzie brakowało parametru [1] w zapytaniu, który poprzedza parametr [2] w definicji indeksu.

0

Rozumiem, czyli nie ma sensu tworzenia wielu statystyk pod ten sam index bo w gruncie rzeczy to nic nie zmienia?

1

Jeśli w tym indeksie jest naprawdę dużo wierszy, to wtedy może się opłacić tworzenie statystyk warunkowych dla danego indeksu (dla zakresów wierszy), jest to spowodowane tym że histogram przechowywany w statystykach może mieć maksymalnie bodaj 200 kroków, jest to jeden z nielicznych przypadków gdzie tworzenie własnych statystyk ma sens.

0

Mógłbyś sprecyzować co to oznacza naprawdę dużo wierszy ?
Czy chodzi o to, że przy dużej ilości danych i indexie na wielu kolumnach statystyki są mniej selektywne ?
Z góry dzięki za pomoc!

1

Nie tyle statystyki są mniej selektywne, co na ich podstawie źle może być oceniona selektywność dla danej wartości parametru w zapytaniu.

zresztą tutaj masz wszystko opisane :
https://docs.microsoft.com/en-us/sql/relational-databases/statistics/statistics?view=sql-server-2017

1 użytkowników online, w tym zalogowanych: 0, gości: 1