小编Sha*_*owe的帖子

SQL 参数嗅探可能的解决方法

我们的系统大约有 500 个“客户”,它们的记录数量存在极大差异。这是一个(非常简化的)示例查询,它可以根据传递的参数返回 0 - 100000 行。这个查询运行 find 但我相当肯定它会受到参数嗅探的影响,具体取决于哪个参数被缓存。

exec sp_executesql N'
               SELECT *
                 FROM Widgets
                WHERE CustomerId=@0
',N'@0 nvarchar(40)',@0=N'bda43162-2d98-4e79-8e81-7056f6df5e51'
Run Code Online (Sandbox Code Playgroud)

如果我修改查询以包含参数作为选择,它似乎会为每个客户缓存查询。

exec sp_executesql N'
               SELECT ''bda43162-2d98-4e79-8e81-7056f6df5e51'', *
                 FROM Widgets
                WHERE CustomerId=@0
',N'@0 nvarchar(40)',@0=N'bda43162-2d98-4e79-8e81-7056f6df5e51'
Run Code Online (Sandbox Code Playgroud)

由于每个客户都缓存了自己的查询版本,因此性能得到了极大的提高。这种方法有任何副作用吗?

假设:

  • 系统的这部分必须是动态 SQL
  • 此查询经常运行
  • 客户数量不会快速增长

编辑:我考虑过使用 OPTION (RECOMPILE) 但如果我可以通过这种方法获得编译查询的好处,我不想每次都重新编译。

sql-server parameter

4
推荐指数
1
解决办法
2993
查看次数

标签 统计

parameter ×1

sql-server ×1