我们的系统大约有 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'
如果我修改查询以包含参数作为选择,它似乎会为每个单独的客户缓存查询。
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'
性能大大提高,因为每个客户都缓存了自己的查询版本。这种方法有副作用吗?
假设:
- 对于系统的这一部分,它必须是动态 SQL
- 此查询经常运行
- 客户数量不会快速增长
编辑:我考虑过使用 OPTION (RECOMPILE),但如果我可以通过这种方法获得编译查询的好处,我不想每次都重新编译。