sql – 何时使用WITH RECOMPILE选项的经验法则

我知道WITH RECOMPILE选项强制优化器重建存储过程的查询计划,但是什么时候想要这样做?

什么时候使用WITH RECOMPILE选项的时候有什么规则呢?

与每个sproc相关的有效开销是甚么?

解决方法

正如其他人所说,你不想在每个存储过程中简单地包括WITH RECOMPILE作为习惯.通过这样做,您将消除存储过程的主要优点之一:保存查询计划的事实.

为什么这可能是一个大问题?计算查询计划比编译常规程序代码要好很多.由于sql语句的语法仅指定了所需的内容,而不是(通常)如何获取它,这样可以在创建物理计划时使数据库具有广泛的灵活性(即,实际上分步指示收集和修改数据).数据库查询预处理器可以做的很多“技巧”和可以做出的选择 – 加入表的顺序,要使用的索引,是否在连接之前或之后应用WHERE子句等.

对于一个简单的SELECT语句,它可能没有什么不同,但对于任何非平凡的查询,数据库将花费一些严重的时间(以毫秒为单位,而不是通常的微秒)来制定一个最佳的计划.对于真正复杂的查询,它甚至不能保证一个最佳的计划,它只能使用启发式来制定一个很好的计划.所以通过强制它每次重新编译,你会告诉它必须经过一遍又一遍的过程,即使它以前的计划是非常好的.

根据供应商,应该有重新编译查询计划的自动触发器 – 例如,如果一个表上的统计信息发生了显着变化(例如,某个列中的值的直方图开始平均分布,随着时间的推移变得高度偏差) DB应该注意并重新编译计划.但是一般而言,数据库的实现者将比所有数据库更加智能.

与任何表演有关,不要在黑暗中拍摄;弄清楚瓶颈是否在90%的成本上,并首先解决.

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 'EastRiver' 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...