暂无图片
Oracle Hint(提示)之 or_expand、no_expand
最近更新:2023-12-17 15:49:16

作用和使用方法

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 |
......