执行此查询时,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毫秒,则会更新统计信息帐户表。
答案 0 :(得分:1)
通常情况下,各种索引的统计数据都不好。即使具有正确的统计数据,索引也只能容纳如此多的样本,有时当值存在大量偏差时,优化器可以认为它不会找到足够小的数字。
此外,您有时可以使用大量[几乎]空块来读取数据值仅在“结束”。这有时意味着你有几个非常接近的变化,一个将需要大量的IO来烧穿孔。同样,如果您实际上没有9201的10个值,如果它选择PK / CI而不是更合适的索引,则必须进行整个表扫描。当你做了大量删除操作时,这种情况更为普遍。
尝试更新各种索引的统计信息,例如&看它是否改变了什么。在单个表扫描中,78秒是IO的批次。