【问题标题】:Statistics and Cardinality Estimation - Why am I seeing this result?统计和基数估计 - 为什么我会看到这个结果?
【发布时间】:2011-10-24 08:06:00
【问题描述】:

我在尝试解决更复杂的问题时遇到了这个小问题,并且在尝试找出优化器时已经走到了尽头。所以,假设我有一个名为“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 的密度值有关。

任何帮助将不胜感激。谢谢!!

编辑:这是最后一次查询执行的执行计划。

【问题讨论】:

  • 行估计为 181.82 的算子执行了多少次?
  • 另外请显示新索引的其他节点值。
  • 1 次执行。我还添加了一个屏幕截图。当您说其他节点值时,您的意思是其他直方图值?
  • 值现在在那里
  • 好吧,如果我不得不猜测这将与索引中第二个键的分布有关。有多少价值,你知道吗?

标签: sql sql-server sql-server-2008 query-optimization


【解决方案1】:

这个需要一些挖掘!

这是以下产品:

  • 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

我猜由于这个实例中的行数实际上并没有影响任何东西,优化器采用了最简单的方法,只是将概率相乘。

【讨论】:

  • 先生,您是一位学者,一位绅士。谢谢!顺便说一句,你是怎么想出来的?在我看来,优化器仍然可以利用 15686 的值,但我想不会。
  • 我把它放到了一个电子表格中,把我们知道的所有统计数据都放进去,然后玩弄它。一旦我找到答案,这很有意义,但基本上我只是将行数乘以密度和频率
【解决方案2】:

只是想写一下,但 JNK 是第一个。

现在基本上散列函数计算两列的结果。 SiteID = 1397 AND DeleteDateTime IS NULL 的哈希函数结果匹配大约 181 行。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-20
    • 2023-02-07
    • 1970-01-01
    • 1970-01-01
    • 2016-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多