本文出处:http://www.cnblogs.com/wy123/p/6008477.html
关于统计信息对数据行数做预估,之前写过对非相关列(单独或者单独的索引列)进行预估时候的算法,参考这里。
今天来写一下统计信息对于复合索引在预估时候的计算方法和潜在问题。
本文原形来自于是个实际业务问题,某SQL在利用一个符合索引做查询的时候,发现始终会出现预估误差较大的情况,
而改变复合索引的列顺序,这个预估行数的误差会发生变化,
也就是说,Create index idx_index1 ON TableName(col1,col2)与Create index idx_index2 on TableName(col2,col1)
用完全一样的的查询条件做查询,两个索引的执行计划对其预估的行数是不一样的
究其原因在哪里呢?
先造一个测试环境:
CREATE TABLE TestStatistics
(
COL1 INT IDENTITY(1,1) ,
COL2 INT ,
COL3 DATETIME ,
COL4 VARCHAR(50)
)
GO
INSERT INTO TestStatistics VALUES (RAND()*10,CAST(GETDATE()-RAND()*300 AS date),NEWID())
GO 1000000 问题重现
首先看一个非常有意思的问题,
在同一张表上,
先这么建一个索引:CREATE INDEX IDX_COL2_COL3 ON TestStatistics(COL2,COL3)
执行一个查询,预估为4127.86行
然后DROP掉上面的索引,继续创建一个索引:CREATE INDEX IDX_COL3_COL2 ON TestStatistics(COL3,COL2)
注意COL2和COL3的顺序不一致
继续执行上面的查询(查询条件不变,数据不变,仅仅是索引列顺序发生了变化),这一次预估为2414.91行
查询条件一样,数据也一样,为什么改变复合索引列顺序会影响到执行计划对数据行的预估呢?