有没有办法强制Oracle在不使用提示的情况下更改查询计划?

Isa*_*c M 2 sql tags oracle indexing oracle11g

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

Jon*_*ler 7

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

  1. SQL计划基准 - 将一个计划替换为另一个计划.
  2. SQL配置文件 - 为计划添加"更正"提示.例如,配置文件可能会说"此连接返回的行数比预期的多100倍",这会间接更改计划.
  3. 存储大纲 - 与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 Translation Framework - 在解析之前将查询更改为另一个查询.这可以使完全"错误"的SQL运行.
  11. SQL修补程序(dbms_sqldiag internal.i_create_patch) - 将查询更改为另一个查询.与DBMS_ADVANCED_REWRITE类似,但它没有文档,可能更强大一些.