繁体   English   中英

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

[英]How can I make sure partition prunning works at run time

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

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

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

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

要重新编译查询,请使用RECOMPILE 查询提示

检查重新编译存储过程以重新编译存储过程。 您可以:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM