我有一个函数,它使用一些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
...
)
...
将工作.