or_expand:优化器将目标SQL中的IN、OR条件拆分成多个UNION的分支形式。 即:IN-List扩展或OR扩展。后续简称:IN-List扩展 默认情况下只有当这种转换的成本小于原查询,优化器才会自动将上述条件拆分。 而使用上述hint后,可以忽略成本强制转换。
no_expand:or_expand的反义。不会考虑将IN、OR条件拆分成多个UNION的转换。
使用语法:
直接加在目标代码块中。
/*+ or_expand(目标表 部分或全部目标列) */ --目标列逗号或空格隔开
/*+ no_expand */
或在外层主查询单独指定目标代码块部分:
SELECT /*+ or_expand(目标表@目标代码块名称 部分或全部目标列) */
SELECT /*+ no_expand(@目标代码块名称) */
创建测试表:
CREATE TABLE TABLE_A as select * from dba_objects;
CREATE TABLE TABLE_B as select * from dba_objects;
测试SQL:
select count(*) from TABLE_A where object_ID =110 or DATA_OBJECT_ID=110;
-----------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | Cost (%CPU)| A-Rows | A-Time | Buffers |
-----------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 348 (100)| 1 |00:00:00.01 | 1249 |
| 1 | SORT AGGREGATE | | 1 | 1 | | 1 |00:00:00.01 | 1249 |
|* 2 | TABLE ACCESS FULL| TABLE_A | 1 | 2 | 348 (1)| 1 |00:00:00.01 | 1249 |
-----------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter(("DATA_OBJECT_ID"=110 OR "OBJECT_ID"=110))
默认情况下走全表扫描。 如果想让优化器单独处理几部分OR分支。则可以使用该hint
select /*+ or_expand(TABLE_A DATA_OBJECT_ID) */count(*) from TABLE_A where object_ID =110 or DATA_OBJECT_ID=110;
------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | Cost (%CPU)| A-Rows | A-Time | Buffers |
------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 696 (100)| 1 |00:00:00.01 | 2498 |
| 1 | SORT AGGREGATE | | 1 | 1 | | 1 |00:00:00.01 | 2498 |
| 2 | CONCATENATION | | 1 | | | 1 |00:00:00.01 | 2498 |
|* 3 | TABLE ACCESS FULL| TABLE_A | 1 | 1 | 348 (1)| 1 |00:00:00.01 | 1249 |
|* 4 | TABLE ACCESS FULL| TABLE_A | 1 | 1 | 348 (1)| 0 |00:00:00.01 | 1249 |