我在查询的开头添加注释(在Oracle中),以提供有关查询本身的元数据信息。
我发现的关于这个主题的每一条信息都只是关于这一点的提示:https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:93449400346099694。
在有和没有注释的情况下,执行计划是否会以相同的方式解释此查询?我的评论会对性能或缓存产生什么影响吗?
当您第一次运行查询时,Oracle会创建执行计划并缓存此计划以供进一步使用。
当您添加任意注释时,实际上您运行不同的查询,因此Oracle会评估新的执行计划。一般来说,这个执行计划可能与第一个执行计划不同 - 尽管不太可能。
我记得在培训中,培训师向我们展示了Oracle提示/*+ RUN_FASTER */
的“秘密” - 在行动中查询的执行速度要快得多!诀窍是,对于原始查询,他存储了一个准备好的执行计划(参见Using Plan Stability),强制进行全表扫描。使用“提示”/*+ RUN_FASTER */
,您有一个新查询,优化器评估了一个新的更好的计划。
事实上,像/*+ RUN_SLOWER */
或/*+ drink a cup of tea */
这样的暗示也是如此,但并没有让学生们惊讶。 :-)
然而,这个故事发生在几年前。我现在假设Oracle优化器更智能,并且忽略了注释(除非有效提示)。但我从未使用最新的Oracle版本对其进行测试。
在我看来,向查询添加注释是一种明智的策略 - 在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
,这是另一种选择将查询与其他执行信息相结合)。