我正在向查询的开头添加注释(在Oracle中),以提供有关查询本身的元数据信息。
我发现的与该主题有关的每条信息都仅涉及提示https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:93449400346099694之外的提示。
执行计划是否将以带注释和不带注释的方式解释该查询?我的评论会对性能或缓存有影响吗?
答案 0 :(得分:3)
第一次运行查询时,Oracle将创建执行计划并缓存该计划以备将来使用。
添加任意注释后,实际上您在运行其他查询,因此Oracle评估了新的执行计划。总体而言,此执行计划可能与第一个计划不同-尽管不太可能。
我记得在一次培训中,培训师向我们展示了“秘密” Oracle提示/*+ RUN_FASTER */
-实际上,查询执行得更快!诀窍在于,对于原始查询,他存储了准备好的执行计划(请参阅Using Plan Stability),强制执行全表扫描。使用“提示” /*+ RUN_FASTER */
,您将有一个新查询,优化器评估了一个新的更好的计划。
实际上,诸如/*+ RUN_SLOWER */
或/*+ drink a cup of tea */
之类的提示也是如此,但没有引起学生的惊讶。 :-)
但是,这个故事发生在几年前。我认为,如今的Oracle优化器更加智能,注释(除非有效的提示)被忽略了。但是我从未使用最新的Oracle版本对其进行过测试。
答案 1 :(得分:1)
在查询中添加注释是一个明智的策略-在Oracle和其他RDBMS中一样。但是在Oracle中,确实确实存在某些情况,其中注释可能会对执行计划产生影响:例如,有些计划管理策略(例如sql基线)使查询与计划(或一组提示)相匹配。 ,并且匹配基于sql_id-如果添加了不同的注释,则此sql_id会更改。
另一个问题是,将优化器提示(/*+ ... */
)与前导注释混合使用可能会导致提示无效-如https://hoopercharles.wordpress.com/2011/01/15/adding-comments-to-sql-statements-improves-performance/所示。
因此,我始终鼓励使用注释,但要将其与提示分开,并尝试找出给定的查询是否属于计划管理的主题(请查看v$sql
及其列{{1} }-也许还有SQL_PLAN_BASELINE
,这是将查询与其他执行信息结合在一起的另一种选择。