【发布时间】:2015-11-20 08:15:59
【问题描述】:
我有一个函数,它使用一些 xmlaggs 数据调用多个表/视图等。
由于某种原因,当我提取额外信息时,即使这些额外信息没有用于其余代码(例如再次使用的键值的索引),我也会获得性能提升。
我已经在快速和慢速查询上运行了 tkprof,但我发现了一些问题 - 第一个是慢速查询在解析和执行期间有遗漏,而快速查询没有。
我的主要问题是,再往下看,我可以看到我的一个视图的成本很高 - 较快的查询使用基础表上的 3 个索引,而较慢的查询没有使用任何索引。
我已尝试插入提示:
SELECT /*+ index(view_alias,table1_index, table2_index, table3_index) */
XMLCONCAT (...
但它仍在进行全表扫描。我是否将优化器提示放在错误的位置或为此使用了错误的语法?
编辑 - 我一直在做更多调查,看来这可能是 Oracle 进行哈希连接而不是嵌套循环的敲门声,但是我的选择来自多个表 - 我可以在所有 3 个表上强制使用 USE_NL ?我如何知道 pl/sql 的哪个区域导致了这种情况,因为它被多次调用。
28/08 更新 - 添加了赏金。如果有任何额外要求,请告诉我。
2009 年 1 月更新 -
> 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 行中的高成本。这可能是此处完整扫描的结果,也可能是进一步向上连接的结果。
【问题讨论】:
-
您可以发布您的表,其中包含任何索引以及您的查询吗?
-
嗨,我打算发布 pl/sql 但是它很长(超过 1000 行)- 实际上格式是 xmlconcat ( xml agg ( xml agg (case ( xmlagg select value1,2 ,3 来自视图 1 2 3 其中 view1 value1 = view2 value2 和 view1 value1 = view3 value3 ) ..... 我引用的视图是同一张表 x3 只是分成不同的类,例如视图 = class1+class2+class3 的聚合. 抱歉,如果这仍然有点不清楚。
-
您可以将其作为文件发布。我认为语法可能是一个问题。你能具体 'index(view_alias.table1_alias table1_index) index(view_alias.table2_alias table2_index)'
-
这个提示应该出现在第一个选择中还是出现在“来自”之前的那个?或者它应该在 from 之后进行,例如FROM /*+ index(view,table1index) index(view,table2index) index(view,table3index) */ schema.view_to_use view ....
-
t1 和 t2 -- 它们是视图,是吗?如果是,视图定义是什么?
标签: sql oracle query-tuning optimizer-hints