gpt4 book ai didi

sql - 关于何时使用WITH RECOMPILE 选项的经验法则

转载 作者:行者123 更新时间:2023-12-02 07:38:42 24 4
gpt4 key购买 nike

我知道WITH RECOMPILE选项会强制优化器重建存储过程的查询计划,但是您希望什么时候发生这种情况?

关于何时使用WITH RECOMPILE 选项、何时不使用的经验法则是什么?

将其放在每个存储过程上的有效开销是多少?

最佳答案

正如其他人所说,您不想只是出于习惯而在每个存储过程中包含 WITH RECOMPILE 。通过这样做,您将消除存储过程的主要好处之一:它保存查询计划。

为什么这可能是一件大事?计算查询计划比编译常规过程代码要密集得多。由于 SQL 语句的语法仅指定您想要什么,而不是(通常)如何获得它,因此数据库在创建物理数据时具有广泛的灵 active 。计划(即实际收集和修改数据的分步说明)。数据库查询预处理器可以执行很多“技巧”并可以做出很多选择 - 连接表的顺序、使用哪些索引、是否在连接之前或之后应用 WHERE 子句,等等

对于一个简单的 SELECT 语句,它可能没有什么区别,但对于任何重要的查询,数据库将花费一些时间(以毫秒为单位,而不是通常的微秒)来得出一个最优计划。对于非常复杂的查询,它甚至不能保证最佳计划,它必须使用启发式方法来提出相当好的计划。因此,通过每次强制它重新编译,您就告诉它必须一遍又一遍地经历这个过程,即使它之前得到的计划非常好。

根据供应商的不同,应该有自动触发器来重新编译查询计划 - 例如,如果表上的统计信息发生显着变化(例如,某个列中的值的直方图开始均匀分布,但随着时间的推移变得高度倾斜) ),那么数据库应该注意到这一点并重新编译计划。但一般来说,数据库的实现者总体上会比你更聪明。

与任何与性能相关的事情一样,不要在黑暗中拍摄;找出导致 90% 性能损失的瓶颈在哪里,然后首先解决它们。

关于sql - 关于何时使用WITH RECOMPILE 选项的经验法则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/422632/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com