Identify OR Expansion in An Explain Plan OR_EXPAND 自动转化成union all

Goal

This note helps you identify OR expansion in an explain plan.

Solution

Legacy OR was a heuristic. The new cost-based OR expansion is costed; there are cases where it will kick in when it didn't before, and visa-versa.

  • Pre-12.2, you will see CONCATENATION in the plan.

  • For 12.2 and onwards, you will see UNION-ALL in the plan.

  • You should see OR_EXPAND in the Outline data

Here is an example in 19c:
--------------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |
--------------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 131 (100)| | | |
| 1 | VIEW | VW_ORE_BA8ECEFB | 1100 | 14300 | 131 (1)| 00:00:01 | | | <----- VW_ORE_<string> may be a clue, as well
| 2 | UNION-ALL | | | | | | | | <-----
| 3 | PARTITION HASH SINGLE | | 1000 | 9000 | 22 (5)| 00:00:01 | 2 | 2 |
|* 4 | TABLE ACCESS FULL | T1 | 1000 | 9000 | 22 (5)| 00:00:01 | 2 | 2 |
| 5 | PARTITION HASH ALL | | 100 | 1300 | 109 (0)| 00:00:01 | 1 | 8 |
|* 6 | TABLE ACCESS BY LOCAL INDEX ROWID BATCHED| T1 | 100 | 1300 | 109 (0)| 00:00:01 | 1 | 8 |
|* 7 | INDEX RANGE SCAN | CI | 100 | | 9 (0)| 00:00:01 | 1 | 8 |
--------------------------------------------------------------------------------------------------------------------------------

Outline Data

-------------

/*+

BEGIN_OUTLINE_DATA

IGNORE_OPTIM_EMBEDDED_HINTS

OPTIMIZER_FEATURES_ENABLE('19.1.0')

DB_VERSION('19.1.0')

ALL_ROWS

OUTLINE_LEAF(@"SET$2A13AF86_2")

OUTLINE_LEAF(@"SET$2A13AF86_1")

OUTLINE_LEAF(@"SET$2A13AF86")

OUTLINE_LEAF(@"SEL$9162BF3C")

OR_EXPAND(@"SEL$1" (1) (2)) <-----

OUTLINE(@"SEL$1")

NO_ACCESS(@"SEL9162BF3C" "VW_ORE_BA8ECEFB"@"SELBA8ECEFB")

FULL(@"SET2A13AF86_1" "T1"@"SET2A13AF86_1")

INDEX_RS_ASC(@"SET2A13AF86_2" "T1"@"SET2A13AF86_2" ("T1"."C"))

BATCH_TABLE_ACCESS_BY_ROWID(@"SET2A13AF86_2" "T1"@"SET2A13AF86_2")

END_OUTLINE_DATA

*/

相关推荐
源码之家4 分钟前
机器学习:基于大数据二手房房价预测与分析系统 可视化 线性回归预测算法 Django框架 链家网站 二手房 计算机毕业设计✅
大数据·算法·机器学习·数据分析·spark·线性回归·推荐算法
Lv Jianwei9 分钟前
Longest Palindromic Substring最长回文子串-学习动态规划Dynamic Programming(DP)
算法
WWZZ202524 分钟前
快速上手大模型:深度学习7(实践:卷积层)
人工智能·深度学习·算法·机器人·大模型·卷积神经网络·具身智能
l1t1 小时前
用SQL求解advent of code 2024年23题
数据库·sql·算法
10岁的博客1 小时前
二维差分算法高效解靶场问题
java·服务器·算法
轻微的风格艾丝凡1 小时前
锂电池 SOC 估计技术综述:成熟算法、新颖突破与车企应用实践
算法·汽车
Codeking__1 小时前
动态规划算法经典问题——01背包问题
算法·动态规划
R-G-B1 小时前
归并排序 (BM20 数组中的逆序对)
数据结构·算法·排序算法
少许极端1 小时前
算法奇妙屋(十二)-优先级队列(堆)
数据结构·算法·leetcode·优先级队列··图解算法
kupeThinkPoem2 小时前
哈希表有哪些算法?
数据结构·算法