4

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

出于某种原因,当我提取附加信息时,我得到了性能提升,即使这些额外信息没有用于其余代码(例如再次使用的键值的索引)。

我已经在快速和慢速查询上运行了 tkprof,我看到了一些问题 - 第一个是慢速查询在解析和执行期间有遗漏,而快速查询没有。

我的主要问题是,再往下看,我可以看到我的一个视图的成本很高 - 更快的查询使用基础表上的 3 个索引,而慢速查询没有使用任何索引。

我试图插入一个提示:

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

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

编辑-我一直在做更多的调查,看来这可能是Oracle进行哈希联接而不是嵌套循环的敲门声,但是我的选择来自多个表-我可以在所有3个表上强制使用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 行中的高成本。这可能是此处完整扫描的结果,或者是进一步向上连接的结果。

4

2 回答 2

1

不使用索引的一个原因是理论上存在空值的可能性。Null 没有索引,因此如果您的查询需要/认为可能有 null,它不能通过索引访问表。

此外,您的提示必须与从以下位置读取表格的级别相同:

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

行不通

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

将工作。

于 2015-08-31T10:12:43.697 回答
1

查询中的微小变化可能会对查询的非常不同的部分产生影响。在这里,更改影响了视图VIP_CODES_VW的连接方式(它在两个地方完成,但第二个对性能的影响更大):在快速查询中它使用NESTED LOOPS(第 79 行)完成,而在慢速查询中- HASH JOIN(行75)。要告诉优化器使用,您可以在查询后NESTED LOOPS添加一个提示。/*+ USE_NL(VIP_CODES_VW) */SELECTVIP_CODES_VW

于 2015-09-03T12:35:55.560 回答