假设我有一个非常大的表,按日期使用月份范围进行分区。
我注意到指定硬值的查询将在执行计划中执行适当的分区修剪。 (WHERE DATE_KEY = '1/1/2011'
)。这将仅扫描该月的分区。
但是我注意到当我使用变量(WHERE DATE_KEY = @DATE_KEY)
时,比如在存储过程中,SQL Server将扫描所有分区。
因此,当缓存执行计划时,SQL Server会执行分区修剪,而不是运行时。哪个不理想。
我找到的解决方法是使用动态SQL而不是EXEC('...WHERE DATE_KEY=''' + @DATE_KEY+ '''')
。哪个有效,但不是很优雅。
所以我想知道是否有一个开关或某个参数,我可以使用它来使这个工作正常,而无需通过动态SQL。说一些假设的"SET COMPILE_PLAN_AT_RUNTIME ON"
或其他......
答案 0 :(得分:4)
使用RECOMPILE
查询提示:
OPTION(RECOMPILE)
确保所比较的参数和列具有相同的数据类型:
(WHERE DATE_KEY = @DATE_KEY)
答案 1 :(得分:0)
要重新编译查询,请使用RECOMPILE query hint。
检查recompiling stored procedures是否重新编译存储过程。你可以:
EXEC sp_my_procedure WITH RECOMPILE
此外,您可以尝试在特定查询的存储过程中使用RECOMPILE查询提示。
不要忘记测试性能,因为重新编译很昂贵。