QB NAME
EXEM Knowledge Base
목차 |
[편집] 기본 정보
[편집] Hint 명
QB_NAME
[편집] Syntax
/*+ QB_NAME(queryblock_name) */
[편집] 지원
10g R1 ~
[편집] 상세 설명
Query Block에 명시적으로 이름을 부여하는 역할을 한다. 주로 Inline View나 Subquery 등에 이름을 붙여서 실행 계획의 가독성을 높이는 용도로 사용된다.
[편집] 사용 예제
[편집] 실행 계획의 가독성
아래 예제와 같이 QB_NAME 힌트를 사용하면 Inline View와 Subquery가 많이 사용된 복잡한 쿼리에 대한 실행 계획의 가독성을 높일 수 있다.
-- Statistics Level 을 All로 변경한다.
alter session set statistics_level = all;
-- QB_NAME 힌트 부여
explain plan for select /*+ qb_name(main) */ t1.id1, t2.name2, x.id4, x.name5,
(select /*+ qb_name(scalar) */ count(*) from t1 s where s.id1 = t1.id1) as id1_1
from t1, t2, t3, t5,
(select /*+ qb_name(inline) */ t4.id4, t5.name5
from t4, t5
where t4.id4 = t5.id5 and t5.name5 like '%c%') x
where t1.id1 = t2.id2
and t2.id2 in (select /*+ qb_name(subquery) */ id3 from t3 where name3 like '%b%')
and t2.id2 = x.id4
and t3.id3 = t1.id1
and t5.name5 = t1.name1;
-- Cursor에서 ALL stats를 조회한다.
select * from table(dbms_xplan.display(null,null, 'ALL'));
----------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 113 | 14 (15)| 00:00:01 |
| 1 | SORT AGGREGATE | | 1 | 13 | | |
|* 2 | INDEX RANGE SCAN | T1_IDX | 1 | 13 | 1 (0)| 00:00:01 |
|* 3 | HASH JOIN | | 1 | 113 | 14 (15)| 00:00:01 |
|* 4 | HASH JOIN SEMI | | 1 | 106 | 12 (17)| 00:00:01 |
| 5 | NESTED LOOPS | | 1 | 86 | 9 (12)| 00:00:01 |
|* 6 | HASH JOIN | | 1 | 73 | 8 (13)| 00:00:01 |
|* 7 | HASH JOIN | | 1 | 53 | 6 (17)| 00:00:01 |
| 8 | NESTED LOOPS | | 1 | 33 | 3 (0)| 00:00:01 |
|* 9 | TABLE ACCESS FULL| T5 | 1 | 20 | 2 (0)| 00:00:01 |
|* 10 | INDEX RANGE SCAN | T4_IDX | 1 | 13 | 1 (0)| 00:00:01 |
| 11 | TABLE ACCESS FULL | T2 | 1 | 20 | 2 (0)| 00:00:01 |
| 12 | TABLE ACCESS FULL | T1 | 1 | 20 | 2 (0)| 00:00:01 |
|* 13 | INDEX RANGE SCAN | T3_IDX | 1 | 13 | 1 (0)| 00:00:01 |
|* 14 | TABLE ACCESS FULL | T3 | 1 | 20 | 2 (0)| 00:00:01 |
| 15 | TABLE ACCESS FULL | T5 | 1 | 7 | 2 (0)| 00:00:01 |
----------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
1 - SCALAR
2 - SCALAR / S@SCALAR
3 - SEL$EA1A1EE6
9 - SEL$EA1A1EE6 / T5@INLINE
10 - SEL$EA1A1EE6 / T4@INLINE
11 - SEL$EA1A1EE6 / T2@MAIN
12 - SEL$EA1A1EE6 / T1@MAIN
13 - SEL$EA1A1EE6 / T3@MAIN
14 - SEL$EA1A1EE6 / T3@SUBQUERY
15 - SEL$EA1A1EE6 / T5@MAIN
[편집] Query Block Name을 다른 Hint에서 사용하기
아래 예제와 같이 QB_NAME을 이용해 부여한 이름을 다른 힌트에서 사용할 수 있다.
select /*+ qb_name(main) no_unnest(@subquery) */ t1.id1, t2.name2, x.id4, x.name5,
(select /*+ qb_name(scalar) */ count(*) from t1 s where s.id1 = t1.id1) as id1_1
from t1, t2, t3, t5,
(select /*+ qb_name(inline) */ t4.id4, t5.name5
from t4, t5
where t4.id4 = t5.id5 and t5.name5 like '%c%') x
where t1.id1 = t2.id2
and t2.id2 in (select /*+ qb_name(subquery) */ id3 from t3 where name3 like '%b%')
and t2.id2 = x.id4
and t3.id3 = t1.id1
and t5.name5 = t1.name1;