#Outline

Outline通过固定SQL语句执行计划确保执行计划稳定性。使用CREATE OUTLINE来创建指定SQL对应的存储纲要,Outline会根据SQL语句对应的当前执行计划生成对应的Hint信息,当存储纲要可用时,数据库将自动根据这些Hint信息生成对应SQL语句的执行计划。

# Outline开关

系统通过USE_STORED_OUTLINES(隐藏参数,默认值FALSE)控制Outline开关,对该参数的值说明如下:

  • true:使用Category为DEFAULT的Outline。
  • false:不使用Outline,为参数默认值。
  • category_name :使用指定Category的Outline。

Category

在创建OUTLINE时,需要为其指定一个类别,用于将Outline分类管理和控制。

# Outline管理

Outline由用户来定义和维护,包括创建、修改和删除。具体操作请参考CREATE OUTLINEALTER OUTLINEDROP OUTLINE

成功创建的Outline可通过DBA_OUTLINES/ALL_OUTLINES/USER_OUTLINES视图查看其定义信息,通过DBA_OUTLINE_HINTS/ALL_OUTLINE_HINTS/USER_OUTLINE_HINTS视图查看其包含的Hint。

# Outline使用

1.创建一个Outline:

-- 对给定的SQL创建Outline。
CREATE OUTLINE ol_ab FOR CATEGORY ctgy_ab ON 
SELECT /*+ FULL(a) */ a.area_name, b.branch_name
FROM area a, branches b
WHERE a.area_no = b.area_no
AND b.branch_no LIKE '01%'
AND a.area_no LIKE '01';
CREATE OUTLINE ol_a FOR CATEGORY ctgy_ab ON 
SELECT /*+ FULL(a) */ a.area_name
FROM area a
WHERE a.area_no LIKE '01';

2.开启ctgy_ab类别的Outline,该类别下所有的Outline都将会生效并被优化器识别:

ALTER SESSION SET USE_STORED_OUTLINES=ctgy_ab;

3.查看Outline是否生效,请注意系统将首先对此SQL语句和ctgy_ab类别下的SQL语句进行大小写不敏感匹配,匹配成功的情况下,优化器才会采纳该Outline并在执行计划中进行列示,如下:

EXPLAIN 
SELECT /*+ FULL(a) */ a.area_name, b.branch_name
FROM area a, branches b
WHERE a.area_no = b.area_no
AND b.branch_no LIKE '01%'
AND a.area_no LIKE '01';

PLAN_DESCRIPTION                                                 
---------------------------------------------------------------- 
SQL hash value: 1136128624                                      
Optimizer: ADOPT_C                                              
                                                                
+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+
| Id | Operation type                 | Name                 | Owner      | Rows     | Cost(%CPU)  | Partition info                 |
+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+
|  0 | SELECT STATEMENT               |                      |            |          |             |                                |
|* 1 |  HASH JOIN INNER               |                      |            |      8000|      722( 0)|                                |
|* 2 |   TABLE ACCESS FULL            | AREA                 | SALES      |     10000|      445( 0)|                                |
|* 3 |   TABLE ACCESS BY INDEX ROWID  | BRANCHES             | SALES      |          |             |                                |
|* 4 |    INDEX RANGE SCAN            | SYS_C_36             | SALES      |     10000|      159( 0)|                                |
+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+
                                                                
Operation Information (identified by operation id):             
---------------------------------------------------             
                                                                
   1 - Predicate : access("A"."AREA_NO" = "B"."AREA_NO")        
   2 - Predicate : filter("A"."AREA_NO" LIKE '01')              
   3 - Predicate : filter("B"."BRANCH_NO" LIKE '01%')           
   4 - Predicate : access("B"."BRANCH_NO" LIKE '01%')           
                                                                
Hint Information :                                              
---------------------------------------------------             
                                                                
full(a) / rejected by IGNORE_OPTIM_EMBEDDED_HINTS               
                                                                
Outline Information :                                           
---------------------------------------------------             
                                                                
   - outline OL_AB used for this statement 

4.查看视图,确认Outline包含的hint是否与执行计划中所列算子和顺序一致:

SELECT join_pos, hint
FROM USER_OUTLINE_HINTS
WHERE name = 'OL_AB';
JOIN_POS HINT                                                             
-------- -----------------------
       0 LEADING(A B)                                                    
       0 USE_HASH(A B)                                                   
       1 FULL(A)                                                         
       1 INDEX(B SYS_C_36) 
pdf-btn 下载文档
copy-btn 复制链接