Oracle/Internal2020. 1. 30. 17:23

V$INDEXED_FIXED_COLUMN 뷰에서 일부 FIXED 테이블에 대한 정보가 누락된 것으로 보인다.


아래는 V$SQL 뷰를 sql_id로 조회한 쿼리의 실행 계획이다. X$KGLCURSOR_CHILD 테이블이 V$SQL 뷰의 베이스 테이블이고, 해당 테이블의 kglobt03 열(= sql_id)이 인덱싱된 것을 확인할 수 있다.

-- 1
SELECT * FROM v$sql WHERE sql_id = '4u5074pdutxzs';

-------------------------------------------------------------
| Id  | Operation               | Name                      |
-------------------------------------------------------------
|   0 | SELECT STATEMENT        |                           |
|*  1 |  FIXED TABLE FIXED INDEX| X$KGLCURSOR_CHILD (ind:2) | -- !
-------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("KGLOBT03"='4u5074pdutxzs' AND "INST_ID"=USERENV('INSTANCE'))

V$INDEXED_FIXED_COLUMN 뷰에서 X$KGLCURSOR_CHILD 테이블을 조회하면 결과가 반환되지 않는다.

-- 2
SELECT * FROM v$indexed_fixed_column WHERE table_name = 'X$KGLCURSOR_CHILD';

선택된 레코드가 없습니다.

아래는 V$INDEXED_FIXED_COLUMN 뷰의 소스다.

-- 3
SELECT a.kqftanam AS table_name
     , b.kqfcoidx AS index_number
     , b.kqfconam AS column_name
     , b.kqfcoipo AS column_position
  FROM x$kqfta a
     , x$kqfco b
 WHERE a.kqftanam = 'X$KGLCURSOR_CHILD'
   AND b.kqfcotab = a.indx
   AND b.kqfcoidx != 0;

선택된 레코드가 없습니다.

X$KGLCURSOR_CHILD 테이블이 X$KQFTA 테이블이 아닌 X$KQFDT 테이블에 저장되어 있기 때문에 결과가 반환되지 않은 것이다. 4-4번 쿼리에서 X$KGLCURSOR_CHILD 테이블이 X$KGLOB 테이블의 메모리 구조를 공유하고 있다는 사실을 유추할 수 있다.

-- 4-1
SELECT kqftaobj, kqftanam FROM x$kqfta WHERE kqftanam = 'X$KGLCURSOR_CHILD';

선택된 레코드가 없습니다.

-- 4-2
SELECT kqfdtobj, kqfdtnam, kqfdtequ FROM x$kqfdt WHERE kqfdtnam = 'X$KGLCURSOR_CHILD';

  KQFDTOBJ KQFDTNAM                  KQFDTEQU
---------- ------------------------- --------
4294952683 X$KGLCURSOR_CHILD         X$KGLOB

1개의 행이 선택되었습니다.

-- 4-3
SELECT kqftaobj, kqftanam FROM x$kqfta WHERE kqftanam = 'X$KGLOB';


  KQFTAOBJ KQFTANAM
---------- --------
4294950985 X$KGLOB

1개의 행이 선택되었습니다.

-- 4-4
SELECT kqfdtobj, kqfdtnam, kqfdtequ FROM x$kqfdt WHERE kqfdtequ = 'X$KGLOB';

  KQFDTOBJ KQFDTNAM                  KQFDTEQU
---------- ------------------------- --------
4294951056 X$KGLTABLE                X$KGLOB
4294951057 X$KGLBODY                 X$KGLOB
4294951058 X$KGLTRIGGER              X$KGLOB
4294951059 X$KGLINDEX                X$KGLOB
4294951060 X$KGLCLUSTER              X$KGLOB
4294951061 X$KGLCURSOR               X$KGLOB
4294952684 X$KGLCURSOR_CHILD_SQLID   X$KGLOB
4294952680 X$KGLCURSOR_CHILD_SQLIDPH X$KGLOB
4294952683 X$KGLCURSOR_CHILD         X$KGLOB
4294953372 X$KGLCURSOR_PARENT        X$KGLOB
4294953759 X$KGLSQLTXL               X$KGLOB

11 행이 선택되었습니다.

아래 쿼리로 X$KGLCURSOR_CHILD 테이블의 인덱싱 칼럼을 조회할 수 있다.

-- 5
SELECT a.kqftanam AS table_name
     , b.kqfcoidx AS index_number
     , b.kqfconam AS column_name
     , b.kqfcoipo AS column_position
  FROM (SELECT a.kqftanam
             , a.indx
          FROM x$kqfta a
      -- WHERE NOT EXISTS (SELECT 1
      --                     FROM x$kqfdt x
      --                    WHERE x.kqfdtequ = a.kqftanam)
        UNION ALL
        SELECT a.kqfdtnam
             , b.indx
          FROM x$kqfdt a
             , x$kqfta b
         WHERE b.kqftanam = a.kqfdtequ) a
     , x$kqfco b
 WHERE a.kqftanam = 'X$KGLCURSOR_CHILD'
   AND b.kqfcotab = a.indx
   AND b.kqfcoidx != 0;

TABLE_NAME        INDEX_NUMBER COLUMN_NAME COLUMN_POSITION
----------------- ------------ ----------- ---------------
X$KGLCURSOR_CHILD            1 KGLNAHSH                  0
X$KGLCURSOR_CHILD            2 KGLOBT03                  0

2 행이 선택되었습니다.


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

X$ Fixed 테이블 약어  (0) 2019.04.21
X$ Fixed 테이블  (0) 2019.04.20
Posted by 정희락_