如何防止 UNPIVOT 变成 UNION ALL?

Joe*_*ish 12 oracle union oracle-12c unpivot

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

好的计划

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

糟糕的计划

颜色对应于两个屏幕截图中的相同表格。对于慢查询,OracleMERGE JOINJOIN. 结果,大约有 1.5 亿个中间行被不必要地处理。

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

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

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

tal*_*150 1

尝试以下 Oracle 优化器提示:

NO_EXPAND
Run Code Online (Sandbox Code Playgroud)

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

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

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

NO_QUERY_TRANSFORMATION
Run Code Online (Sandbox Code Playgroud)

但此提示会禁用优化器可以执行的所有查询转换(优化器始终可以应用的转换除外)。