Oracle/Internal View2018. 3. 2. 11:51

VW_TE 인터널 뷰를 살펴보자.


테스트를 위해 아래와 같이 테이블을 생성하자. t1_x1 인덱스의 p1 파티션은 USABLE, p2, p3 파티션은 UNUSABLE 상태다.

-- 1
DROP TABLE t1 PURGE;

CREATE TABLE t1 (c1 NUMBER, c2 NUMBER)
PARTITION BY RANGE (c1) (
    PARTITION p1 VALUES LESS THAN (2)
  , PARTITION p2 VALUES LESS THAN (3)
  , PARTITION p3 VALUES LESS THAN (MAXVALUE));

CREATE INDEX t1_x1 ON t1 (c2) LOCAL UNUSABLE;
ALTER INDEX t1_x1 REBUILD PARTITION p1;


아래 쿼리의 실행 계획에서 VW_TE 인터널 뷰를 확인할 수 있다. EXPAND_TABLE 힌트에서 TE가 Table Expand의 약어임을 유추할 수 있다. 해당 쿼리 변환은 11.2 버전에 추가된 것으로 보인다.

-- 2
ALTER SESSION SET "_optimizer_table_expansion" = true;

SELECT /*+ INDEX(T1) EXPAND_TABLE(T1) */
       *
  FROM t1
 WHERE c2 = 1;

--------------------------------------------------------------------------------
| Id  | Operation                                    | Name    | Pstart| Pstop |
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                             |         |       |       |
|   1 |  VIEW                                        | VW_TE_1 |       |       |
|   2 |   UNION-ALL                                  |         |       |       |
|   3 |    PARTITION RANGE SINGLE                    |         |     1 |     1 |
|   4 |     TABLE ACCESS BY LOCAL INDEX ROWID BATCHED| T1      |     1 |     1 |
|*  5 |      INDEX RANGE SCAN                        | T1_X1   |     1 |     1 |
|   6 |    PARTITION RANGE OR                        |         |KEY(OR)|KEY(OR)|
|*  7 |     TABLE ACCESS BY LOCAL INDEX ROWID BATCHED| T1      |KEY(OR)|KEY(OR)|
|*  8 |      INDEX RANGE SCAN                        | T1_X1   |KEY(OR)|KEY(OR)|
--------------------------------------------------------------------------------


QT는 위 쿼리를 아래 쿼리로 변환한다. 인덱스를 사용할 수 있는 p1 파티션은 인덱스로 액세스하고, 인덱스를 사용할 수 없는 p2, p3 파티션은 파티션을 전체 스캔한다.

-- 3
SELECT vw_te_1.c1
     , vw_te_1.c2
  FROM ((SELECT c1, c2
           FROM scott.t1 t1
          WHERE c2 = 1
            AND c1 < 2)
        UNION ALL
        (SELECT c1, c2
           FROM t1
          WHERE c2 = 1
            AND (   c1 >= 2
                 OR c1 IS NULL))) vw_te_1;


아래와 같이 NO_EXPAND_TABLE 힌트를 사용하면 전체 파티션을 풀스캔한다.

-- 4
SELECT /*+ INDEX(T1) NO_EXPAND_TABLE(T1) */
       *
  FROM t1
 WHERE c2 = 1;

 --------------------------------------------------------------------
| Id  | Operation                          | Name  | Pstart| Pstop |
--------------------------------------------------------------------
|   0 | SELECT STATEMENT                   |       |       |       |
|   1 |  PARTITION RANGE ALL               |       |     1 |     3 |
|   2 |   TABLE ACCESS BY LOCAL INDEX ROWID| T1    |     1 |     3 |
|*  3 |    INDEX RANGE SCAN                | T1_X1 |     1 |     3 |
--------------------------------------------------------------------


'Oracle > Internal View' 카테고리의 다른 글

VM_NWVW 인터널 뷰  (0) 2018.03.02
VW_WIF 인터널 뷰  (0) 2018.03.02
VW_SSQ 인터널 뷰  (0) 2018.03.02
VW_SQ 인터널 뷰  (0) 2018.03.02
VW_ORE 인터널 뷰  (0) 2018.03.02
Posted by 정희락_