SQL Server选择错误的执行计划

时间:2014-01-13 05:25:12

标签: sql sql-server sql-server-2008 sql-execution-plan

执行此查询时,SQL Server选择了错误的执行计划,为什么?

SELECT   top 10 AccountNumber , AVERAGE 
FROM     [M].[dbo].[Account] 
WHERE    [Code] = 9201
Go
SELECT   top 10 AccountNumber , AVERAGE 
FROM     [M].[dbo].[Account] with (index(IX_Account))
WHERE    [Code] = 9201

SQL Server为此查询选择了聚簇PK索引,并且已用时间= 78254毫秒,但如果我强制SQL Server选择非聚集索引,则已用时间为2毫秒,则会更新统计信息帐户表。

1 个答案:

答案 0 :(得分:1)

通常情况下,各种索引的统计数据都不好。即使具有正确的统计数据,索引也只能容纳如此多的样本,有时当值存在大量偏差时,优化器可以认为它不会找到足够小的数字。

此外,您有时可以使用大量[几乎]空块来读取数据值仅在“结束”。这有时意味着你有几个非常接近的变化,一个将需要大量的IO来烧穿孔。同样,如果您实际上没有9201的10个值,如果它选择PK / CI而不是更合适的索引,则必须进行整个表扫描。当你做了大量删除操作时,这种情况更为普遍。

尝试更新各种索引的统计信息,例如&看它是否改变了什么。在单个表扫描中,78秒是IO的批次