如何根据解释计划输出创建优化器提示?

How to create optimizer hints based on explain plan output?

有没有办法使用解释计划输出为该执行路径生成一整套优化器提示?或者,更准确地说,有没有一种方法可以在不从头编写全套提示的情况下稍微调整执行路径?

背景
我是一名数据分析师,试图了解有关 Oracle (11g) 上复杂 sql 查询的性能调优的更多信息。因此,我习惯于阅读解释计划以找出我的查询中的缺陷。为了修复这些缺陷,我只能调整我的查询,因为我无权更改我正在使用的表的索引。我开始使用但知之甚少的其中一件事是优化器提示。当我提示优化器更改执行路径(例如,使用降序而不是默认的升序)时,它确实会这样做,丢弃诸如循环法和缓冲区排序之类的东西(或它所做的任何事情)计划的其他部分。为了防止这种情况,我将不得不编写一整套提示,而我首先要寻找这整套提示的地方是解释计划。我希望有一种快速的方法可以稍微改变这个计划并告诉我的查询遵循它。

要回答第一部分,一旦您通过 EXPLAIN PLAN FOR SELECT... 生成了计划,您就可以使用以下命令查看保留该计划的全套提示。

select * from table(dbms_xplan.display(null, null, 'OUTLINE'));

但是,如果您调整这些提示,就会 运行 给它提供相互冲突的指令的风险。