【发布时间】:2017-09-07 21:46:12
【问题描述】:
我需要一些帮助。
我目前正在对一些需要一段时间才能返回结果的动态 SQL 进行故障排除。我正在使用 SQL Server 2008 R2,构建 10.50.4305
我已经执行了 SQL 跟踪,所以我现在可以看到发生了什么,基本上罪魁祸首是聚集索引扫描。
选择包含:
WHERE
Name LIKE @Query + '%' ESCAPE '\'
ORDER BY
这会导致聚集索引扫描。
如果我将选择更改为
WHERE
Name LIKE 'value' + '%' ESCAPE '\'
ORDER BY
我得到一个索引查找和一个键查找。
我看起来使用了 forceseek 查询提示,但我得到了错误....
消息 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
【问题讨论】:
-
您能否发布表结构、表上定义的任何索引以及您的完整查询?
-
如果你的名字列有索引,我在这两种情况下都找到了,请提供测试数据供我们检查问题
-
A
LIKE最后带有%的搜索应该能够使用索引...您是否尝试将变量@Query设置为相同的值,这可以快速运行, (如果放置为文字)?如果您的@Query包含其他字符,例如下划线或[]括号(更多),这些字符在LIKE模式中使用,这可能会欺骗您...提供@Query内容的一些示例跨度> -
补充:您谈到
dynamic SQL... 在SQL 中,您经常会在对象名称中找到下划线(例如object_id)或像[dbo],[SomeTable]这样的括号。LIKE将尝试将这些用作模式... -
如果该语句确实是动态 SQL,难道不应该更好地编写只查询您想要过滤的内容,而不是在执行中计算和连接吗?
标签: sql-server tsql sql-server-2008-r2 clustered-index