我有一个函数,会调用几个表格/视图等数据,并使用一些xmlagg进行处理。
奇怪的是,当我添加额外信息时,即使这些信息不在代码的其他部分中使用(例如索引关键值),性能也有所提高。
我已经在快慢两个查询上运行了tkprof,并发现了一些问题- 首先是缓慢的查询在解析和执行过程中存在未命中情况,而快速的查询则没有。
我的主要问题是,进一步查看后,我发现其中一个视图的成本非常高 - 快速查询正在使用底层表格的3个索引,而缓慢的查询没有使用任何索引。
我尝试插入了一个提示:
然而,它仍在进行全表扫描。我是把优化器提示放错了位置还是使用了错误的语法?
编辑 - 我进行了更多的调查,发现这可能是 Oracle 执行哈希连接而不是嵌套循环所导致的,但我的选择来自几个表 - 我可以强制所有三个使用 USE_NL 吗?我如何知道 PL / SQL 的哪个区域导致这种情况,因为它被多次调用。
更新 28/08 - 添加赏金,请让我知道是否需要任何额外的内容。
更新 01/09 -
奇怪的是,当我添加额外信息时,即使这些信息不在代码的其他部分中使用(例如索引关键值),性能也有所提高。
我已经在快慢两个查询上运行了tkprof,并发现了一些问题- 首先是缓慢的查询在解析和执行过程中存在未命中情况,而快速的查询则没有。
我的主要问题是,进一步查看后,我发现其中一个视图的成本非常高 - 快速查询正在使用底层表格的3个索引,而缓慢的查询没有使用任何索引。
我尝试插入了一个提示:
SELECT /*+ index(view_alias,table1_index, table2_index, table3_index) */
XMLCONCAT (...
然而,它仍在进行全表扫描。我是把优化器提示放错了位置还是使用了错误的语法?
编辑 - 我进行了更多的调查,发现这可能是 Oracle 执行哈希连接而不是嵌套循环所导致的,但我的选择来自几个表 - 我可以强制所有三个使用 USE_NL 吗?我如何知道 PL / SQL 的哪个区域导致这种情况,因为它被多次调用。
更新 28/08 - 添加赏金,请让我知道是否需要任何额外的内容。
更新 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 ( ....
有两个被注释掉的选择器,只要其中一个取消注释就可以使查询速度更快。在查询中,t1和t2都没有被使用。
更新01/09: 执行计划如下: 快速执行 http://pastebin.com/pbJMSxrB 慢速执行 http://pastebin.com/zt3eUYNd
我想纠正第86行的高代价操作。这可能是由于全面扫描或更上层的连接导致的。