如何确保分区修剪在运行时工作

时间:2011-11-25 22:03:22

标签: sql-server stored-procedures partitioning

假设我有一个非常大的表,按日期使用月份范围进行分区。

我注意到指定硬值的查询将在执行计划中执行适当的分区修剪。 (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"或其他......

2 个答案:

答案 0 :(得分:4)

  1. 使用RECOMPILE查询提示:
    OPTION(RECOMPILE)

  2. 确保所比较的参数和列具有相同的数据类型:
    (WHERE DATE_KEY = @DATE_KEY)

答案 1 :(得分:0)

要重新编译查询,请使用RECOMPILE query hint

检查recompiling stored procedures是否重新编译存储过程。你可以:

  • 在存储过程定义中标记为WITH RECOMPILE - SQL Server将在每次执行之前重新编译过程;如果经常调用存储过程,请注意性能命中;检查CREATE PROCEDURE
  • 在每个EXEC语句末尾添加WITH RECOMPILE:EXEC sp_my_procedure WITH RECOMPILE
  • 使用sp_recompile强制重新编译第一次下次执行

此外,您可以尝试在特定查询的存储过程中使用RECOMPILE查询提示。

不要忘记测试性能,因为重新编译很昂贵。