本文讨论了Oracle提示 - 影响查询执行计划的导演。它强调在使用提示之前了解优化器的重要性,提倡一种有条不紊的方法,包括彻底的测试和文档。艺术
Oracle提示是嵌入在SQL语句中的指令,可为优化器提供有关如何执行查询的指导。它们本质上覆盖了优化器的自动选择,迫使其使用特定的执行计划。当优化器的默认计划次优时,通常使用提示,导致查询性能不佳。它们是使用/* hint_name(arguments) */
语法指定的,该 * /语法放置在SELECT
, UPDATE
, DELETE
或MERGE
关键字之前或之后的SQL语句中。
例如, /* INDEX(table_name index_name) */
提示指示优化器使用指定的索引访问table_name
。类似地, /* FULL(table_name) */
强制一个完整的表扫描, /* ORDERED USE_NL(table1 table2) */
指定嵌套的循环在table1
和table2
之间。了解各种提示类型(例如,加入提示,访问路径提示,转换提示)及其含义对于有效使用至关重要。在诉诸提示之前,了解基础查询计划和优化器基于成本的决策也很重要。不当使用提示会导致性能退化。在应用提示评估其影响之前和之后,强烈建议使用SQL开发人员或Toad等工具来分析执行计划。
有效地采用提示需要有条不紊的方法。应遵循以下最佳实践:
EXPLAIN PLAN
和可视化工具等工具彻底分析查询的执行计划。识别瓶颈,并了解为什么优化器选择当前计划。该分析对于确定提示是否真正必要和使用哪种提示至关重要。是的,如果不明确使用,从长远来看,使用提示可能会对查询性能产生负面影响。以下是:
几个提示应高度谨慎使用,或完全避免了它们对负面影响的潜力:
/* USE_HASH(table1 table2) */
和/* USE_MERGE(table1 table2) */
:而Hash和Merge Join通常是有效的,如果Optimizer根据数据特征选择了Optimizer选择更好的加入方法,则强迫它们可能有害。/* FULL(table_name) */
:这暗示了完整的表扫描,除非有非常令人信服的原因(例如,非常小,没有合适的索引),除非有效率效率低下)。/* NO_INDEX(table_name index_name) */
:类似于FULL
,仅在经过彻底的分析后绝对必要时才能使用。它可以防止使用潜在的有益指数。通常,除非您对基础算法有深入了解,否则会避免大大限制优化器的选择的提示以及需要使用的特定情况。专注于解决性能问题的根本原因,而不是用提示掩盖它们。请记住,调整良好的优化器通常比手动强制执行计划更有效。
以上是如何使用提示影响Oracle优化器?的详细内容。更多信息请关注PHP中文网其他相关文章!