繁体   English   中英

避免在SQL Server 2008 R2中进行索引扫描

[英]Avoid index scan in SQL Server 2008 R2

我在这里需要一些帮助。

我目前正在对一些动态SQL进行故障排除,这需要一定的时间才能返回结果。 我正在使用SQL Server 2008 R2,内部版本10.50.4305

我已经执行了SQL跟踪,所以现在我可以看到发生了什么,基本上,罪魁祸首是聚集索引扫描。

选择包含:

WHERE 
    Name LIKE @Query + '%' ESCAPE '\' 
ORDER BY

这将导致聚集索引扫描。

如果我将选择更改为

WHERE 
    Name LIKE 'value' + '%' ESCAPE '\' 
ORDER BY

我得到索引搜索和关键查找。

我看起来好像在使用forceseek查询提示,但出现错误...。

Msg 8622,第16级,状态1,第6行
由于此查询中定义的提示,查询处理器无法生成查询计划。 重新提交查询而不指定任何提示,也无需使用SET FORCEPLAN。

我们将非常感谢您提供有关如何在查询中保留参数以及避免聚集索引扫描的任何帮助或建议。

更新(摘自Shnugo的评论)

我已经将查询添加到原始问题,并且无论结果是快还是慢,每次@Query的值都相同

DECLARE @Query nvarchar(50)

SET @Query = 'EIKO'

SET NOCOUNT ON
SELECT TOP 5 pex.Ric.Name AS Id, pex.Ric.Name + '|' + pex.Ric.DisplayName AS Name FROM pex.Ric WITH (nolock) WHERE pex.Ric.Name LIKE @Query + '%' ESCAPE '\' ORDER BY PeId, Name

正如我在评论中所指出的那样,我假设动态SQL中的某些字符被解释为模式。 使用ESCAPE可能会提示您,您已经意识到这一点,并插入了替换字符以将这些特殊字符标记为正常字符...

看起来好像您只是在寻找相同的开始...试试这个

WHERE LEFT(Name,LEN(@Query))=@Query

这应该从Name的左侧剪切相同数量的字符,并将其与@Query变量进行比较。

这种方法不会很快,因为它不是可保留的,也不能使用索引,但是-如果我的假设是正确的-它应该比LIKE快,后者对每一行进行复杂的模式检查...

更新(摘自下面的评论)

难道是其他沉重的举动窃取了服务器的资源? 您是否尝试了没有ORDER BY吗?

我只是尝试了一下,然后可以重现。 搜索文字意味着优化器可以提前了解所有内容:最佳预测,统计信息和索引的最佳用法。 此外,您的结果可能会产生误导。 如果一遍又一遍地执行此操作,结果将被缓存。 使用相同的查询,您可能会得到非常快速的答案-但它们来自缓存...

参数嗅探也可能是一个问题。

这可能有助于将语句创建为字符串(带有文字)并使用EXEC运行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM