2014-01-13 137 views
0

执行此查询时,SQL Server会选择错误的执行计划,为什么?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选择此查询和使用时间= 78254毫秒聚集PK指数,但如果我强迫SQL Server中选择一个非聚集索引,然后经过时间为2毫秒,统​​计帐户表被更新。

+2

请张贴您的表格定义。 – Raj

+0

CREATE TABLE [DBO]。[帐户]( \t [ACCOUNTID] [BIGINT] IDENTITY(1,1)NOT NULL, \t [代码] [SMALLINT] NOT NULL, \t [账户号码] [BIGINT] NOT NULL, \t [AVERAGE] [浮子] NULL, \t [TOTALDBAMNT] [浮子] NULL, \t [TOTALCRAMNT] [浮子] NULL, 约束[PK_Account] PRIMARY KEY CLUSTERED ( \t [ACCOUNTID] ASC )WITH( PAD_INDEX = OFF,STATISTICS_NORECOMPUTE = OFF,IGNORE_DUP_KEY = OFF,ALLOW_ROW_LOCKS = ON,ALLOW_PAGE_LOCKS = ON)ON [PRIMARY] )ON [P RIMARY] – user3189030

+0

而你在'CODE'列有一个非聚集索引? – Raj

回答

1

这通常是由于各种指标的统计数据不佳。即使有正确的统计数据,索引也只能保存这么多的样本,偶尔如果数值存在大量偏差,那么优化器可以认为它不会找到足够小的数字。

此外,您可能有时会有大量的[几乎]空块读取数据值只在“结束”。这有时候意味着你有一些其他变化很近的地方,那就需要大量的IO来烧穿这些洞。同样,如果你实际上没有9201的值,那么如果它选择了PK/CI而不是更适合的索引,它将不得不进行整个表扫描。当你完成大量删除操作时,这种情况更为普遍。

尝试更新各种索引和类似的东西&看看它是否改变任何东西。 78秒是在单个表扫描上的IO的批次