오라클 데이터베이스는 X$로 시작하는 Fixed 테이블을 제공하고 있다. 해당 테이블은 V$ 동적 성능 뷰의 소스로 사용된다. GV$PARAMETER 뷰를 예로 들어보자.
*_VIEW 뷰에서는 GV$PARAMETER 뷰의 내용을 확인할 수 없다.
1 2 3 4 |
-- 1 SELECT text FROM dba_views WHERE view_name = 'GV$PARAMETER' ; 선택된 레코드가 없습니다. |
*_SYNONYMS 뷰를 살펴보면 GV$PARAMETER가 GV_$PARAMETER 뷰의 공용 시너님인 것을 알 수 있다.
1 2 3 4 5 6 7 8 |
-- 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 딜레마다.
1 2 3 4 5 6 7 8 |
-- 3 SELECT text FROM dba_views WHERE view_name = 'GV_$PARAMETER' ; TEXT --------------------------------------- select "INST_ID" , ... from gv$parameter 1개의 행이 선택되었습니다. |
V$ 동적 성능 뷰의 정의를 조회하기 위해서는 V$FIXED_VIEW_DEFINITION 뷰를 사용해야 한다.
1 2 3 4 5 6 7 8 |
-- 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번 줄을 주석 처리하면 전체 파라미터를 확인할 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
-- 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 뷰에서 확인할 수 있다.
1 2 3 4 5 6 7 8 9 |
-- 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 뷰의 정의를 확인해보자.
1 2 3 4 |
-- 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 테이블의 상세한 정보를 확인할 수 있다.
1 2 3 4 5 6 7 8 |
-- 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
-- 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 뷰에서 확인할 수 있다. 해당 정보를 참조하여 딕셔너리 뷰를 사용한 쿼리를 튜닝할 수 있다.
1 2 3 4 5 6 7 8 9 |
-- 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 테이블의 칼럼 정보를 조회할 수 있다는 사실을 알아낼 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
-- 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 테이블의 칼럼 정보를 확인할 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
-- 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 |
- 해당 Fixed 인덱스는 12.1 버전에 추가된 것으로 보인다. [본문으로]
'Oracle > Internal' 카테고리의 다른 글
V$INDEXED_FIXED_COLUMN 뷰 정보 누락 (0) | 2020.01.30 |
---|---|
X$ Fixed 테이블 약어 (0) | 2019.04.21 |