如何防止UNPIVOT转换为UNION ALL?


13

我有一个稍微复杂的Oracle查询,大约需要半个小时才能完成。如果我执行查询的慢速部分并单独运行它,它将在几秒钟内完成。这是隔离查询的SQL Monitor报告的屏幕截图:

好的计划

作为完整查询的一部分运行时,这是相同的逻辑:

坏计划

颜色与两个屏幕截图中的相同表格相对应。对于慢速查询,Oracle MERGE JOIN在的两个表中没有相等条件的表之间执行JOIN。结果,不必要地处理了大约1.5亿个中间行。

我可以通过查询提示或重写来解决此问题,但我想尽可能多地了解根本原因,以便将来避免该问题并可能向Oracle提交错误报告。每次我得到错误的计划UNPIVOT时,查询文本中的内容都会转换为UNION ALL计划中的一个。为了进一步调查,我想阻止查询转换的发生。我无法找到此转换的名称。我也无法找到阻止它的查询提示或下划线参数。我正在开发服务器上进行测试,因此一切正常。

有什么我可以做,以防止的查询转换UNPIVOTUNION ALL?我使用的是Oracle 12.1.0.2。

由于IP原因,我无法共享查询,表名或数据。我无法提出一个简单的复制品。话虽如此,我仍不清楚为什么需要这些信息来回答这个问题。是UNPIVOT查询以及与UNION ALL相同的查询的示例。


1
在您的示例中,所有均存在,因此显示。我运行了自己的查询,该查询没有所有并集,并且解释了计划没有显示所有并集。因此,可能是您的查询而不是造成问题的非透视操作?
拉吉

@Raj的重点是禁用该转换而不更改查询文本,以进一步缩小问题的范围。
Joe Obbish

3
我已经与Oracle合作多年,但是有时我需要查看查询或至少兼容的伪查询,并替换您的列/表。没有它,我可以继续猜测,但这对您和我都不有用。
拉吉

Answers:


1

尝试以下Oracle优化器提示:

NO_EXPAND

此提示禁用OR扩展。OR扩展将where子句中的组合OR条件或IN列表转换为带有的复合查询union all

我们没有您的SQL,所以这是一个猜测,但似乎是一个可行的选择。

作为第二种选择,由于您处于开发环境中,因此可以尝试Oracle优化器提示:

NO_QUERY_TRANSFORMATION

但是此提示会禁用优化器可以执行的所有查询转换,而不是优化器始终可以应用的转换。


OR与UNPIVOT不同。您能否生成一个简单的示例来显示NO_EXPAND提示适用于UNPIVOT?我已经尝试过了,但是它对我不起作用。
Joe Obbish

@JoeObbish-能否为UNPiVOT提供按比例缩小的复杂SQL版本?如果可以的话,我想帮助您...
tale852150

1
@JoeObbish-另一个建议更新了答案。希望这可以帮助。
tale852150
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.