为什么不使用我的计划指南?


9

最近,我们遇到了临界点问题,由于查询优化器会忽略搜索列上的非聚集索引,因此一些过去几秒钟即可完成执行的报表查询现在要花费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

非聚集索引的外观如何?服务器忽略它的原因是因为它认为不会做任何事情。您的计划有误或索引有误
艾伦·汉森

3
顺便说一句,请请请的变化throwtime between '3/20/2014 7:00:00 AM' and '3/24/2014 6:59:59 AM'throwtime >= '20140320 07:00' AND throwtime < '20140324 07:00';-请这个博客帖子,也这一个
亚伦·伯特兰

@AaronBertrand非常感谢。是的,我也建议进行更改,他们将在下一个版本中进行更改。
RK库帕拉2014年

Answers:


11

查询必须完全匹配,包括空格。我建议您从缓存中获取查询,然后从中创建查询,而不是以任何其他方式输入查询。


0

再次阅读您的链接文章

几乎可以肯定,编写计划指南以强制使用索引不是您想要的,因为这将导致书签查询效率低下。根据您的文章,此查询最有效的性能的正确解决方案是将索引更改为覆盖的非聚集索引,换句话说,将表中的所有列都添加到索引中,或(最好是),只需添加此查询所需的列,然后将选择内容更改为仅提取这些列即可。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.