sql – 何时使用WITH RECOMPILE选项的经验法则
我知道WITH RECOMPILE选项强制优化器重建存储过程的查询计划,但是什么时候想要这样做?
什么时候使用WITH RECOMPILE选项的时候有什么规则呢? 与每个sproc相关的有效开销是甚么? 解决方法正如其他人所说,你不想在每个存储过程中简单地包括WITH RECOMPILE作为习惯.通过这样做,您将消除存储过程的主要优点之一:保存查询计划的事实.为什么这可能是一个大问题?计算查询计划比编译常规程序代码要好很多.由于SQL语句的语法仅指定了所需的内容,而不是(通常)如何获取它,这样可以在创建物理计划时使数据库具有广泛的灵活性(即,实际上分步指示收集和修改数据).数据库查询预处理器可以做的很多“技巧”和可以做出的选择 – 加入表的顺序,要使用的索引,是否在连接之前或之后应用WHERE子句等. 对于一个简单的SELECT语句,它可能没有什么不同,但对于任何非平凡的查询,数据库将花费一些严重的时间(以毫秒为单位,而不是通常的微秒)来制定一个最佳的计划.对于真正复杂的查询,它甚至不能保证一个最佳的计划,它只能使用启发式来制定一个很好的计划.所以通过强制它每次重新编译,你会告诉它必须经过一遍又一遍的过程,即使它以前的计划是非常好的. 根据供应商,应该有重新编译查询计划的自动触发器 – 例如,如果一个表上的统计信息发生了显着变化(例如,某个列中的值的直方图开始平均分布,随着时间的推移变得高度偏差) DB应该注意并重新编译计划.但是一般而言,数据库的实现者将比所有数据库更加智能. 与任何表演有关,不要在黑暗中拍摄;弄清楚瓶颈是否在90%的成本上,并首先解决. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- SQL Server 按日期选择最晚日期与最早日期对应的数的差值
- sql-server – 以特定用户身份执行xp_cmdshell命令
- sql-server – 使用Delphi中的ADOConnection查看’print’语
- sqlserver数据库置疑解决
- sql-server – Hash,Merge和Loop join之间的区别?
- SqlServer支持 select * from (select *from tablename)
- SQLserver读取库中的所有表名
- sql-server – SQL Service Broker,作为.net的通用企业消息
- sql-server – 如果SELECT语句中没有结果,则使用CASE返回字
- data.table分别对数字和文本变量进行分组