Статистика и оценка мощности - Почему я вижу этот результат? - PullRequest
8 голосов
/ 10 августа 2011

Я столкнулся с этой маленькой проблемой, пытаясь решить более сложную проблему, и дошел до конца своей попытки разобраться с оптимизатором.Итак, допустим, у меня есть таблица MyTable, которую можно определить следующим образом:

CREATE TABLE MyTable (
GroupClosuresID int identity(1,1) not null, 
SiteID int not null, 
DeleteDateTime datetime null
, CONSTRAINT PK_MyTable PRIMARY KEY (GroupClosuresID, SiteID))

В этой таблице 286 685 строк, и запуск DBCC SHOW_STATISTICS('MyTable','PK_MyTable') даст:

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

Теперь я запускаю запрос к этой таблице без создания дополнительных индексов или статистики.

SELECT GroupClosuresID FROM MyTable WHERE SiteID = 1397 AND DeleteDateTime IS NULL

Теперь появляются два новых объекта статистики, один для столбца SiteID, а другой для DeleteDateTimeколонка.Вот они соответственно (примечание: исключена некоторая не относящаяся к делу информация):

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

План выполнения, сгенерированный для запроса, который я выполнил выше, не преподносит мне сюрпризов.Он состоит из простого сканирования кластерного индекса с оценочными строками 14282.3 и 15676 действительными строками.Из того, что я узнал о статистике и оценке стоимости, используя две гистограммы выше, мы можем умножить селективность SiteID (16005.02 / 286685) на селективность DeleteDateTime (255827/286685), чтобы получить составную селективность 0,0498187307480119.Умножение на это общее количество строк (286685) дает нам то же самое, что и оптимизатор: 14282.3 .

Но здесь я запутался.Я создаю индекс с CREATE INDEX IX_MyTable ON Mytable (SiteID, DeleteDateTime), который создает собственный объект статистики:

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

Когда я запускаю тот же запрос, что и раньше (SELECT GroupClosuresID FROM MyTable WHERE SiteID = 1397 AND DeleteDateTime IS NULL), я все равно получаю 15676 возвращенных строк, , но мой расчетныйКоличество строк теперь 181,82 .

Я пытался манипулировать числами, чтобы выяснить, откуда исходит эта оценка, но я просто не могу ее получить.Я должен предположить, что это связано со значениями плотности для IX_MyTable.

Любая помощь будет принята с благодарностью.Спасибо !!

РЕДАКТИРОВАТЬ: Вот план выполнения для последнего выполнения запроса.Last run

Ответы [ 2 ]

7 голосов
/ 11 августа 2011

Это заняло некоторое копание!

Это продукт:

  • NULL плотность в вашем поле даты (из вашего первого набора статистики 255827/286685 = .892363
  • ... умноженная на плотность первого поля (siteid) в вашем новом индексе: 0.0007107321

Формула:

.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

Я предполагаю, что, поскольку количество строк в этом случае фактически ни на что не влияет, оптимизатор выбрал самый простой маршрут и просто умножил вероятности вместе.

0 голосов
/ 11 августа 2011

Просто хотел написать об этом, но JNK был первым.

В основном хеш-функция теперь вычисляет результаты для двух столбцов.И результат хеш-функции для SiteID = 1397 И DeleteDateTime IS NULL соответствует примерно 181 строке.

http://en.wikipedia.org/wiki/Hash_table#Hash_function

...