Oracle:以注释开头的查询是否会影响性能?

问题描述 投票:3回答:2

我在查询的开头添加注释(在Oracle中),以提供有关查询本身的元数据信息。

我发现的关于这个主题的每一条信息都只是关于这一点的提示:https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:93449400346099694

在有和没有注释的情况下,执行计划是否会以相同的方式解释此查询?我的评论会对性能或缓存产生什么影响吗?

sql oracle performance sql-execution-plan
2个回答
3
投票

当您第一次运行查询时,Oracle会创建执行计划并缓存此计划以供进一步使用。

当您添加任意注释时,实际上您运行不同的查询,因此Oracle会评估新的执行计划。一般来说,这个执行计划可能与第一个执行计划不同 - 尽管不太可能。

我记得在培训中,培训师向我们展示了Oracle提示/*+ RUN_FASTER */的“秘密” - 在行动中查询的执行速度要快得多!诀窍是,对于原始查询,他存储了一个准备好的执行计划(参见Using Plan Stability),强制进行全表扫描。使用“提示”/*+ RUN_FASTER */,您有一个新查询,优化器评估了一个新的更好的计划。

事实上,像/*+ RUN_SLOWER *//*+ drink a cup of tea */这样的暗示也是如此,但并没有让学生们惊讶。 :-)

然而,这个故事发生在几年前。我现在假设Oracle优化器更智能,并且忽略了注释(除非有效提示)。但我从未使用最新的Oracle版本对其进行测试。


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及其列SQL_PLAN_BASELINE - 也许还有SQL_PATCH,这是另一种选择将查询与其他执行信息相结合)。

© www.soinside.com 2019 - 2024. All rights reserved.