sql – Oracle优化器提示xmlagg函数

我有一个函数,它使用一些xmlaggs数据调用几个表/视图等.

出于某种原因,当我提取额外信息时,我的性能会提高,即使这些额外信息不用于其余代码(例如再次使用键值的索引).

我已经对快速和慢速运行tkprof并且我看到了一些问题 – 第一个是在解析和执行期间慢速查询未命中而快速查询没有.

我的主要问题是向下看,我可以看到我的一个视图的高成本 – 更快的查询使用基础表上的3个索引,而慢速查询不使用任何.

我试图插入一个提示:

SELECT /*+ index(view_alias,table1_index, table2_index, table3_index) */     
XMLCONCAT (...

但它仍在进行全表扫描.我是将优化器提示放在错误的位置还是使用了错误的语法?

编辑 – 我一直在做更多的调查,看起来它可能是来自Oracle做一个哈希连接而不是一个嵌套循环,但是我的选择来自几个表 – 我可以强制所有3上的USE_NL吗?我如何知道pl / sql的哪个区域导致这种情况,因为它被多次调用.

更新28/08 – Bounty补充道.如果有任何额外要求,请告诉我.

更新01/09 –

> SELECT XMLCONCAT (  XMLELEMENT (  "1",  (SELECT XMLCONCAT(  XMLELEMENT
> (  "2",  XMLELEMENT (  "3",  XMLFOREST (  )),  CASE  WHEN   THEN    
> XMLELEMENT (  "3",  XMLFOREST (  ))  END),  /*   (SELECT XMLELEMENT ( 
> "4",  XMLAGG (XMLELEMENT ("5")))  FROM TABLE t1,  t2  WHERE t1.col1 =
> t2.col2)  ,*/    CASE  WHEN   THEN  (SELECT XMLAGG (  XMLELEMENT ( 
> "5", */(SELECT col1  FROM TABLE t1,  t2  WHERE t1.col1 = t2.col2),*/ 
> XMLFOREST ( ....

有两个注释掉的选项,当EITHER被取消注释时,它会使其成为执行速度更快的查询. t1和t2根本不在查询的其他地方使用.

更新01/09
以下是执行计划:
http://pastebin.com/pbJMSxrB
http://pastebin.com/zt3eUYNd

这是86行的高成本,我希望纠正.这可能是此处完整扫描的结果,或者是连接的结果.

最佳答案 不使用索引的原因是存在空值的理论可能性. Null没有编入索引,因此如果您的查询需要/认为可能存在空值,则无法通过索引访问该表.

此外,您的提示必须与您的表格读取的级别相同:

select /*+parallel(table_a)*/ ...
from (
      select ...
      from table_a
      ...
      )
...

不行

select  ...
from (
      select /*+parallel(table_a)*/ ...
      from table_a
      ...
      )
...

将工作.

点赞