Natknąłem się na ten mały problem, próbując rozwiązać bardziej złożony problem i dotarłem do końca liny, próbując znaleźć optymalizator. Więc powiedzmy, że mam tabeli o nazwie `MojaTabela”, który można określić tak:Statystyki i szacowanie liczności - dlaczego widzę ten wynik?
CREATE TABLE MyTable (
GroupClosuresID int identity(1,1) not null,
SiteID int not null,
DeleteDateTime datetime null
, CONSTRAINT PK_MyTable PRIMARY KEY (GroupClosuresID, SiteID))
Ten stół ma 286,685 wierszy w nim i działa DBCC SHOW_STATISTICS('MyTable','PK_MyTable')
przyniesie:
Name Updated Rows Rows Sampled Steps Density Average key length String Index Filter Expression Unfiltered Rows
-------------------------------------------------------------------------------------------------------------------------------- -------------------- -------------------- -------------------- ------ ------------- ------------------ ------------ ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------------------
PK_MyTable Aug 10 2011 1:00PM 286685 286685 18 0.931986 8 NO NULL 286685
(1 row(s) affected)
All density Average Length Columns
------------- -------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
3.743145E-06 4 GroupClosuresID
3.488149E-06 8 GroupClosuresID, SiteID
(2 row(s) affected)
RANGE_HI_KEY RANGE_ROWS EQ_ROWS DISTINCT_RANGE_ROWS AVG_RANGE_ROWS
------------ ------------- ------------- -------------------- --------------
1 0 8 0 1
129 1002 7 127 7.889764
242 826 6 112 7.375
531 2010 6 288 6.979167
717 1108 5 185 5.989189
889 822 4 171 4.807017
1401 2044 4 511 4
1763 1101 3 361 3.049861
14207 24780 1 12443 1.991481
81759 67071 1 67071 1
114457 31743 1 31743 1
117209 2047 1 2047 1
179109 61439 1 61439 1
181169 1535 1 1535 1
229410 47615 1 47615 1
235846 2047 1 2047 1
275456 39442 1 39442 1
275457 0 1 0 1
Teraz uruchomić zapytanie w tej tabeli bez tworzenia dodatkowych indeksów lub statystyk.
SELECT GroupClosuresID FROM MyTable WHERE SiteID = 1397 AND DeleteDateTime IS NULL
dwie nowe statystyki obiekty pojawiają się teraz, po jednym dla kolumny SiteID
a drugi dla DeleteDateTime
kolumnie. Oto one odpowiednio (Uwaga: Niektóre non-istotne informacje zostały wykluczone):
Name Updated Rows Rows Sampled Steps Density Average key length String Index Filter Expression Unfiltered Rows
-------------------------------------------------------------------------------------------------------------------------------- -------------------- -------------------- -------------------- ------ ------------- ------------------ ------------ ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------------------
_WA_Sys_00000002_7B0C223C Aug 10 2011 1:15PM 286685 216605 200 0.03384706 4 NO NULL 286685
(1 row(s) affected)
All density Average Length Columns
------------- -------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
0.0007380074 4 SiteID
(1 row(s) affected)
RANGE_HI_KEY RANGE_ROWS EQ_ROWS DISTINCT_RANGE_ROWS AVG_RANGE_ROWS
------------ ------------- ------------- -------------------- --------------
.
.
.
1397 59.42782 16005.02 5 11.83174
.
.
.
Name Updated Rows Rows Sampled Steps Density Average key length String Index Filter Expression Unfiltered Rows
-------------------------------------------------------------------------------------------------------------------------------- -------------------- -------------------- -------------------- ------ ------------- ------------------ ------------ ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------------------
_WA_Sys_00000006_7B0C223C Aug 10 2011 1:15PM 286685 216605 201 0.7447883 0.8335911 NO NULL 286685
(1 row(s) affected)
All density Average Length Columns
------------- -------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
0.0001065871 0.8335911 DeleteDateTime
(1 row(s) affected)
RANGE_HI_KEY RANGE_ROWS EQ_ROWS DISTINCT_RANGE_ROWS AVG_RANGE_ROWS
----------------------- ------------- ------------- -------------------- --------------
NULL 0 255827 0 1
.
.
.
Plan wykonanie generowane dla zapytania wpadłem powyżej daje mi żadnych niespodzianek. Składa się z prostego indeksu klastrowego z oszacowanymi rzędami i 15676 wierszy rzeczywistych. Z tego, czego się dowiedziałem o statystykach i szacowaniu kosztów, używając dwóch histogramów powyżej, możemy pomnożyć selektywność SiteID (16005.02/286685) razy selektywność metody DeleteDateTime (255827/286685), aby uzyskać selektywność kompozytu 0,0498187307480119. Pomnożenie tego czasu przez całkowitą liczbę wierszy (286685) daje nam dokładnie to samo, co zrobił optymalizator: 14282.3.
Ale tu się mylę. Utworzyć indeks z CREATE INDEX IX_MyTable ON Mytable (SiteID, DeleteDateTime)
który tworzy własne statystyki obiektu:
Name Updated Rows Rows Sampled Steps Density Average key length String Index Filter Expression Unfiltered Rows
-------------------------------------------------------------------------------------------------------------------------------- -------------------- -------------------- -------------------- ------ ------------- ------------------ ------------ ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------------------
IX_MyTable Aug 10 2011 1:41PM 286685 286685 200 0.02749305 8.822645 NO NULL
286685
(1 row(s) affected)
All density Average Length Columns
------------- -------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
0.0007107321 4 SiteID
7.42611E-05 4.822645 SiteID, DeleteDateTime
3.488149E-06 8.822645 SiteID, DeleteDateTime, GroupClosuresID
(3 row(s) affected)
RANGE_HI_KEY RANGE_ROWS EQ_ROWS DISTINCT_RANGE_ROWS AVG_RANGE_ROWS
------------ ------------- ------------- -------------------- --------------
.
.
.
1397 504 15686 12 42
.
.
.
Kiedy uruchomić tę samą kwerendę jak poprzednio (SELECT GroupClosuresID FROM MyTable WHERE SiteID = 1397 AND DeleteDateTime IS NULL
) I jeszcze dostać 15676 wiersze zwracane ale mój szacowana liczba wierszy jest teraz 181,82.
Próbowałem manipulować liczbami, aby spróbować dowiedzieć się, skąd pochodzi ta ocena, ale po prostu nie mogę jej uzyskać. Muszę założyć, że jest to związane z wartościami gęstości dla IX_MyTable.
Każda pomoc zostanie bardzo doceniona. Dzięki!!
EDYCJA: Oto plan wykonania dla tego ostatniego wykonania zapytania.
Ile egzekucje były tam od operatora z szacunków rzędzie 181.82? – JNK
Proszę również pokazać dodatkowe wartości węzłów dla nowego indeksu. – JNK
1 wykonanie. Dodałem również zrzut ekranu. Kiedy mówisz o wartościach dodatkowych węzłów, masz na myśli inne wartości histogramu? –