2011-08-10 11 views
8

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. Last run

+1

Ile egzekucje były tam od operatora z szacunków rzędzie 181.82? – JNK

+0

Proszę również pokazać dodatkowe wartości węzłów dla nowego indeksu. – JNK

+0

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? –

Odpowiedz

7

Ten wziął trochę kopania!

Jest produktem:

  • NULL gęstości datę pola (z pierwszego zestawu statystykach 255827/286685 = .892363
  • ...razy gęstość pierwszego pola (siteid) w nowym indeksie: 0.0007107321

Formuła jest:

.00071017321 * 286685 = 203.7562 
-- est. rows with your value in siteid based on even distribution of values 

255827/286685 = 0.892363 
-- Probability of a NULL across all rows 

203.7562 * 0.892363 = 181.8245 

Zgaduję, że ponieważ liczba wierszy w tym przypadku faktycznie nie wpływa cokolwiek, optymalizator podjął najłatwiejszą trasę i po prostu pomnożył razem prawdopodobieństwa.

+0

Jesteś, proszę pana, uczonym i dżentelmenem. Dziękuję Ci! A propos, jak to rozgryzłeś? Wydawało mi się, że optymalizator nadal będzie mógł wykorzystać wartość 15686, ale chyba nie. –

+2

Umieściłem go w arkuszu kalkulacyjnym, umieściłem wszystkie statystyki, które znaliśmy i bawiliśmy się z nim. Kiedy znalazłem odpowiedź, miało to wiele sensu, ale w zasadzie pomnożyłem liczby rzędów według gęstości i częstotliwości – JNK

Powiązane problemy