Oracle/Internal2019. 4. 20. 12:42

오라클 데이터베이스는 X$로 시작하는 Fixed 테이블을 제공하고 있다. 해당 테이블은 V$ 동적 성능 뷰의 소스로 사용된다. GV$PARAMETER 뷰를 예로 들어보자.

 

*_VIEW 뷰에서는 GV$PARAMETER 뷰의 내용을 확인할 수 없다.

-- 1
SELECT text FROM dba_views WHERE view_name ='GV$PARAMETER';

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

 

*_SYNONYMS 뷰를 살펴보면 GV$PARAMETER가 GV_$PARAMETER 뷰의 공용 시너님인 것을 알 수 있다.

-- 2
SELECT * FROM dba_synonyms WHERE synonym_name ='GV$PARAMETER';

OWNER  SYNONYM_NAME  TABLE_OWNER TABLE_NAME    DB_LINK
------ ------------  ----------- ------------- -------
PUBLIC GV$PARAMETER  SYS         GV_$PARAMETER

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

 

*_VIEW 뷰에서 GV_$PARAMETER 뷰를 조회해보면 GV_$PARAMETER 뷰가 GV$PARAMETER 시너님을 조회하는 다소 엉뚱한 결과를 확인할 수 있다. Chicken or Egg 딜레마다.

-- 3
SELECT text FROM dba_views WHERE view_name ='GV_$PARAMETER';

TEXT
---------------------------------------
select "INST_ID", ... from gv$parameter

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

 

V$ 동적 성능 뷰의 정의를 조회하기 위해서는 V$FIXED_VIEW_DEFINITION 뷰를 사용해야 한다.

-- 4
SELECT view_definition FROM v$fixed_view_definition WHERE view_name ='GV$PARAMETER';

VIEW_DEFINITION
--------------------------------------------------------------------------------
select x.inst_id, ... from x$ksppi x, x$ksppcv y where (x.indx = y.indx) and ...

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

 

아래는 GV$PARAMETER 뷰의 정의를 정리한 결과다. 24~28번 줄을 주석 처리하면 전체 파라미터를 확인할 수 있다.

-- 5
SELECT x.inst_id AS inst_id
     , x.indx + 1 AS num
     , x.ksppinm AS name
     , x.ksppity AS type
     , y.ksppstvl AS value
     , y.ksppstdvl AS display_value
     , y.ksppstdfl AS default_value
     , y.ksppstdf AS isdefault
     , DECODE (BITAND (x.ksppiflg / 256, 1), 1, 'TRUE', 'FALSE') AS isses_modifiable
     , DECODE (BITAND (x.ksppiflg / 65536, 3), 1, 'IMMEDIATE', 2, 'DEFERRED', 3, 'IMMEDIATE', 'FALSE') AS issys_modifiable
     , DECODE (BITAND (x.ksppiflg, 4), 4, 'FALSE', DECODE (BITAND (x.ksppiflg / 65536, 3), 0, 'FALSE', 'TRUE')) AS isinstance_modifiable
     , DECODE (BITAND (y.ksppstvf, 7), 1, 'MODIFIED', 4, 'SYSTEM_MOD', 'FALSE') AS ismodified
     , DECODE (BITAND (y.ksppstvf, 2), 2, 'TRUE', 'FALSE') AS isadjusted
     , DECODE (BITAND (x.ksppilrmflg / 64, 1), 1, 'TRUE', 'FALSE') AS isdeprecated
     , DECODE (BITAND (x.ksppilrmflg / 268435456, 1), 1, 'TRUE', 'FALSE') AS isbasic
     , x.ksppdesc AS description
     , y.ksppstcmnt AS update_comment
     , x.ksppihash AS hash
     , y.con_id
  FROM x$ksppi x
     , x$ksppcv y
 WHERE (x.indx = y.indx)
-- AND BITAND (x.ksppiflg, 268435456) = 0
-- AND (    (TRANSLATE (x.ksppinm, '_', '#') NOT LIKE '##%')
--      AND (   (TRANSLATE (x.ksppinm, '_', '#') NOT LIKE '#%')
--           OR (y.ksppstdf = 'FALSE')
--           OR (BITAND (y.ksppstvf, 5) > 0)))
;

 

뷰의 정의에서 GV$PARAMETER 뷰가 X$KSPPI, X$KSPPCV 테이블을 사용하는 것을 알 수 있다. Fixed 테이블에 대한 정보는 V$FIXED_TABLE 뷰에서 확인할 수 있다.

-- 6
SELECT * FROM v$fixed_table WHERE name IN ('X$KSPPI', 'X$KSPPCV');

NAME      OBJECT_ID TYPE  TABLE_NUM CON_ID
-------- ---------- ----- --------- ------
X$KSPPI  4294950998 TABLE       107      0
X$KSPPCV 4294951198 TABLE       108      0

2 행이 선택되었습니다.

 

동일한 방식으로 V$FIXED_TABLE 뷰의 정의를 확인해보자.

-- 7
SELECT inst_id, kqftanam, kqftaobj, 'TABLE', indx , con_id FROM x$kqfta UNION ALL
SELECT inst_id, kqfvinam, kqfviobj, 'VIEW' , 65537, con_id FROM x$kqfvi UNION ALL
SELECT inst_id, kqfdtnam, kqfdtobj, 'TABLE', 65537, con_id FROM x$kqfdt;

 

X$KQFTA 테이블에서 X$KSPPI 테이블의 상세한 정보를 확인할 수 있다.

-- 8
SELECT * FROM x$kqfta WHERE indx = 107;

ADDR             INDX INST_ID CON_ID   KQFTAOBJ KQFTAVER KQFTANAM KQFTATYP KQFTAFLG KQFTARSZ KQFTACOC
---------------- ---- ------- ------ ---------- -------- -------- -------- -------- -------- --------
00007FF6B70C6A90  107       1      0 4294950998        7 X$KSPPI         5     1024      376       10

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

 

V$PARAMETER 뷰를 사용한 쿼리의 실행 계획을 보면 Fixed 인덱스의 존재 여부를 알 수 있다.[각주:1]

-- 9-1
SELECT * FROM v$parameter;

-----------------------------------------------------
| Id  | Operation                | Name             |
-----------------------------------------------------
|   0 | SELECT STATEMENT         |                  |
|   1 |  NESTED LOOPS            |                  |
|*  2 |   FIXED TABLE FULL       | X$KSPPI          |
|*  3 |   FIXED TABLE FIXED INDEX| X$KSPPCV (ind:1) |
-----------------------------------------------------

-- 9-2
SELECT * FROM v$parameter WHERE name = 'db_file_multiblock_read_count';

-----------------------------------------------------
| Id  | Operation                | Name             |
-----------------------------------------------------
|   0 | SELECT STATEMENT         |                  |
|   1 |  NESTED LOOPS            |                  |
|*  2 |   FIXED TABLE FIXED INDEX| X$KSPPI (ind:1)  |
|*  3 |   FIXED TABLE FIXED INDEX| X$KSPPCV (ind:1) |
-----------------------------------------------------

 

Fixed 인덱스에 대한 정보는 V$INDEXED_FIXED_COLUMN 뷰에서 확인할 수 있다. 해당 정보를 참조하여 딕셔너리 뷰를 사용한 쿼리를 튜닝할 수 있다.

-- 10
SELECT * FROM v$indexed_fixed_column WHERE table_name IN ('X$KSPPI', 'X$KSPPCV');

TABLE_NAME INDEX_NUMBER COLUMN_NAME COLUMN_POSITION CON_ID
---------- ------------ ----------- --------------- ------
X$KSPPI               1 KSPPINM                   0      0
X$KSPPCV              1 INDX                      0      0

2 행이 선택되었습니다.

 

Fixed 테이블의 칼럼에 대한 뷰는 제공되지 않는다. V$INDEXED_FIXED_COLUMN 뷰의 정의를 살펴보면 X$KQFCO 테이블에서 Fixed 테이블의 칼럼 정보를 조회할 수 있다는 사실을 알아낼 수 있다.

-- 11
SELECT c.kqfcocno, c.kqfconam, c.kqfcodty, c.kqfcosiz
  FROM x$kqfta t
     , x$kqfco c
 WHERE t.inst_id = 1
   AND t.kqftanam = 'X$KSPPI'
   AND t.indx = c.kqfcotab;

KQFCOCNO KQFCONAM    KQFCODTY KQFCOSIZ
-------- ----------- -------- --------
       1 ADDR              23        8
       2 INDX               2        4
       3 INST_ID            2        4
       4 CON_ID             2        2
       5 KSPPINM            1       80
       6 KSPPITY            2        4
       7 KSPPDESC           1      255
       8 KSPPIFLG           2        4
       9 KSPPILRMFLG        2        4
      10 KSPPIHASH          2        4

10 행이 선택되었습니다.

 

SQL*Plus의 DESC 명령어를 사용해도 Fixed 테이블의 칼럼 정보를 확인할 수 있다.

-- 12
DESC x$ksppi

 이름        널? 유형
 ----------- --- -------------
 ADDR            RAW(8)
 INDX            NUMBER
 INST_ID         NUMBER
 CON_ID          NUMBER
 KSPPINM         VARCHAR2(80)
 KSPPITY         NUMBER
 KSPPDESC        VARCHAR2(255)
 KSPPIFLG        NUMBER
 KSPPILRMFLG     NUMBER
 KSPPIHASH       NUMBER


  1. 해당 Fixed 인덱스는 12.1 버전에 추가된 것으로 보인다. [본문으로]

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

V$INDEXED_FIXED_COLUMN 뷰 정보 누락  (0) 2020.01.30
X$ Fixed 테이블 약어  (0) 2019.04.21
Posted by 정희락_