我们的系统大约有 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)
由于每个客户都缓存了自己的查询版本,因此性能得到了极大的提高。这种方法有任何副作用吗?
假设:
编辑:我考虑过使用 OPTION (RECOMPILE) 但如果我可以通过这种方法获得编译查询的好处,我不想每次都重新编译。