我有一个函数,它使用一些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根本不在查询的其他地方使用。
这是86行的高成本,我希望纠正。 这可能是此处完整扫描的结果,或者是连接的结果。