【发布时间】:2014-12-01 14:44:43
【问题描述】:
我有 SQL 命令
exec sp_executesql N'SELECT TOP (10) * FROM mytableView WHERE ([Name]) LIKE (''%'' +
(@Value0) + ''%'') ORDER BY [Id] DESC',N'@Value0 varchar(5)',@Value0='value'
这个 sql 命令执行时间接近 22 秒。我发现它发生是因为我有一个参数嗅探.. 如果添加到 SQL 命令 option(recompile) 的末尾,它的工作速度很快:在 Managements studio 中显示 0 秒
exec sp_executesql N'SELECT TOP (10) * FROM mytableView WHERE ([Name]) LIKE
(''%'' + (@Value0) + ''%'') ORDER BY [Id] DESC
option(recompile)',N'@Value0 varchar(5)',@Value0='value'
是否可以重新编译/重新创建/擦除/更新执行计划以使我的 SQL 命令在没有选项(重新编译)的情况下工作?
我已尝试申请
- 更新统计数据
- sp_recompile
- DBCC FREEPROCCACHE
- DBCC UPDATEUSAGE (0)
- DBCC FREESYSTEMCACHE ('ALL')
- 更改索引并重建 不幸的是,所有这些操作都对我没有帮助。
【问题讨论】:
-
你为什么要在动态sql中这样做?此外,前导通配符会导致您的查询不可搜索。
-
为什么你不想使用
OPTION (RECOMPILE)? -
Sean Lange:我有一个带有过滤器选项的网格。当用户在网格中键入 somevalue 时,我会生成带有前导通配符的 SQL 命令。所以我只是将 '*' 转换为 '%'
-
GarethD:我读到该选项(重新编译)会增加一些开销,因为它会在每次执行查询时重建执行计划..
标签: sql sql-server tsql