最近,我们遇到了临界点问题,由于查询优化器会忽略搜索列上的非聚集索引,因此一些过去几秒钟即可完成执行的报表查询现在要花费2分钟以上的时间。下面的示例查询:
select top 100 *
from [dbo].[t_Call]
where ID > 0
and throwtime between '3/20/2014 7:00:00 AM' and '3/24/2014 6:59:59 AM'
order by id
该ID
列是聚集索引,并且Throwtime
具有非聚集索引。在这种情况下,我们注意到使用了排序方式throwtime
而不是ID
更改查询计划和非聚集索引。我们还计划归档一些旧数据(当前有2000万行!!)。但是在应用程序中进行这些更改将需要一些时间,我需要找到一种方法使报表运行得相当快,而无需在应用程序级别进行更改(哦,这就是生命!)。
输入计划指南。我使用非聚集索引查询提示创建了以下计划指南,由于某种原因,仍然不使用非聚集索引。我想念什么吗?
EXEC sp_create_plan_guide
@name = N'[prod2reports_callthrowtime]',
@stmt = N'select top 100 *
from [dbo] . [t_Call]
where ID > @0 and @1 < = ThrowTime and ThrowTime < = @2 order by ID',
@type = N'SQL',
@module_or_batch = N'select top 100 *
from [dbo] . [t_Call]
where ID > @0 and @1 < = ThrowTime and ThrowTime < = @2 order by ID',
@params = N'@0 int, @1 datetime, @2 datetime',
@hints = N'OPTION (TABLE HINT( [dbo] . [t_Call],
INDEX(IDX_NC_t_call_ThrowtimeProblemCodes)))'
GO
非聚集索引的外观如何?服务器忽略它的原因是因为它认为不会做任何事情。您的计划有误或索引有误
—
艾伦·汉森
@AaronBertrand非常感谢。是的,我也建议进行更改,他们将在下一个版本中进行更改。
—
RK库帕拉2014年