【问题标题】:Is there a way to force Oracle to change a query's plan without using hints?有没有办法强制 Oracle 在不使用提示的情况下更改查询计划?
【发布时间】:2015-07-31 22:25:17
【问题描述】:

我有一个使用错误索引的查询。我可以看到,使用索引没有简单的方法让 oracle 获取数据。查询是由供应商软件构建的,无法更改,有没有办法强制 oracle 在没有提示的情况下更改解释计划。 任何帮助将不胜感激。

【问题讨论】:

  • 分析/估计统计数据?如果您无法更改查询,那么您可能无能为力(除了添加/删除索引)。
  • SQL Profiles 浮现在脑海中(如果您有企业版)。检查企业管理器(又名“网格控制”),很容易安排调优任务,从而发现更好的计划。
  • 你是说你认为甲骨文的计划是错误的?首先确认不同的计划更有效(通过提示)然后尝试找出它提出如此无效的计划的原因(通常是因为统计数据不正确)是有用的

标签: sql oracle indexing oracle11g tags


【解决方案1】:

至少有 11 种方法可以在不修改查询的情况下控制计划。它们按有用的顺序大致列出如下:

  1. SQL 计划基准 - 将一个计划替换为另一个计划。
  2. SQL 配置文件 - 在计划中添加“纠正”提示。例如,配置文件可能会说“此连接返回的行数是预期的 100 倍”,这间接地改变了计划。
  3. Stored Outline - 与 SQL Plan Baseline 类似,但功能较少。此选项使用更简单,但功能较弱且不再受支持。
  4. DBMS_STATS.SET_X_STATS - 手动修改表、列和索引统计信息可以通过人为地使对象看起来或多或少昂贵来显着改变计划。
  5. 会话控制 - 例如alter session set optimizer_features_enable='11.2.0.3';。并不总是有有用的参数。但是其中一个 OPTIMIZER_* 参数可能会有所帮助,或者您可以使用未记录的提示更改计划或禁用如下功能:alter session set "_fix_control"='XYZ:OFF';
  6. 系统控制 - 与上述类似,但适用于整个系统。
  7. DBMS_SPD - SQL 计划指令类似于配置文件,因为它向优化器提供一些纠正信息。但这适用于所有计划的较低级别,并且是 12c 的新功能。
  8. DBMS_ADVANCED_REWRITE - 将一个查询更改为另一个查询。
  9. 虚拟专用数据库 - 通过添加谓词将查询更改为另一个查询。它并非旨在提高性能,但您可能会滥用它来更改索引访问路径。
  10. SQL 翻译框架 - 将一个查询更改为另一个查询,甚至在它被解析之前。这会导致完全“错误”的 SQL 运行。
  11. SQL 补丁 (dbms_sqldiag internal.i_create_patch) - 将一个查询更改为另一个查询。与 DBMS_ADVANCED_REWRITE 类似,但它没有文档,可能更强大。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-17
    相关资源
    最近更新 更多