오라클 데이터베이스는 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
- 해당 Fixed 인덱스는 12.1 버전에 추가된 것으로 보인다. [본문으로]
'Oracle > Internal' 카테고리의 다른 글
V$INDEXED_FIXED_COLUMN 뷰 정보 누락 (0) | 2020.01.30 |
---|---|
X$ Fixed 테이블 약어 (0) | 2019.04.21 |