Определение fixed view
Такие view, как v$session, v$waitstat построены на базе fixed tables.
Их определение можно найти в v$fixed_view_definition (которая, разумеется,
содержит описание и самой себя). Небольшая проблема здесь в том, что
описание в v$fixed_view_definition содержится, как правило, в неформатированном
виде. Вот в таком, например:
SQL> select view_definition from v$fixed_view_definition where view_name='GV$SESSION';
VIEW_DEFINITION
--------------------------------------------------------------------------------
select inst_id,addr,indx,ksuseser,ksuudses,ksusepro, ksuudlui,ksuudlna,ksuudoct,
ksusesow, decode(ksusetrn,hextoraw('00'),null,ksusetrn), decode(ksqpswat,hextor
aw('00'),null,ksqpswat), decode(bitand(ksuseidl,11),1,'ACTIVE',0, decode(bitand(
ksuseflg,4096),0,'INACTIVE','CACHED'),2,'SNIPED',3,'SNIPED', 'KILLED'), decode(k
sspatyp,1,'DEDICATED',2,'SHARED',3,'PSEUDO','NONE'), ksuudsid,ksuudsna,ksuseunm,
ksusepid,ksusemnm,ksusetid,ksusepnm, decode(bitand(ksuseflg,19),17,'BACKGROUND',
1,'USER',2,'RECURSIVE','?'), ksusesql, ksusesqh, ksusepsq, ksusepha, ksuseapp, k
suseaph, ksuseact, ksuseach, ksusecli, ksusefix, ksuseobj, ksusefil, ksuseblk,
ksuseslt, ksuseltm, ksusectm, decode(bitand(ksusepfl, 16),0,'NO','YES'), deco
de(ksuseft, 2,'SESSION', 4,'SELECT',8,'TRANSACTIONAL','NONE'), decode(ksusefm,1,
'BASIC',2,'PRECONNECT',4,'PREPARSE','NONE'), decode(ksusefs, 1, 'YES', 'NO'), ks
VIEW_DEFINITION
--------------------------------------------------------------------------------
usegrp, decode(bitand(ksusepfl,16),16,'ENABLED', decode(bitand(ksusepfl,32),3
2,'FORCED','DISABLED')), decode(bitand(ksusepfl,64),64,'FORCED', decode(bitan
d(ksusepfl,128),128,'DISABLED','ENABLED')), decode(bitand(ksusepfl,512),512,'FO
RCED', decode(bitand(ksusepfl,256),256,'DISABLED','ENABLED')), ksusecqd, ksus
eclid from x$ksuse where bitand(ksspaflg,1)!=0 and bitand(ksuseflg,1)!=0
SQL>
Конечно, можно без проблем отформатировать этот текст вручную. Однако, в какой-то момент нам захотелось поразглядывать определения всех fixed views. В Oracle 9i их 259 штук. Вручную, прямо скажем, отформатировать нереально. Поэтому мы написали небольшой скрипт на python, который проделал всю грязную работу за нас.
Например, результат его работы по gv$session (для версии 9i) выглядит почти так:
select
inst_id, -- INST_ID NUMBER
addr, -- SADDR RAW(4)
indx, -- SID NUMBER
ksuseser, -- SERIAL# NUMBER
ksuudses, -- AUDSID NUMBER
ksusepro, -- PADDR RAW(4)
ksuudlui, -- USER# NUMBER
ksuudlna, -- USERNAME VARCHAR2(30)
ksuudoct, -- COMMAND NUMBER
ksusesow, -- OWNERID NUMBER
decode -- TADDR VARCHAR2(8)
(ksusetrn, hextoraw ('00'), null, ksusetrn),
decode -- LOCKWAIT VARCHAR2(8)
(ksqpswat, hextoraw ('00'), null, ksqpswat),
decode -- STATUS VARCHAR2(8)
(bitand (ksuseidl, 11), 1, 'ACTIVE', 0, decode (bitand (ksuseflg, 4096), 0,
'INACTIVE', 'CACHED'), 2, 'SNIPED', 3, 'SNIPED', 'KILLED'),
decode -- SERVER VARCHAR2(9)
(ksspatyp, 1, 'DEDICATED', 2, 'SHARED', 3, 'PSEUDO', 'NONE'),
ksuudsid, -- SCHEMA# NUMBER
ksuudsna, -- SCHEMANAME VARCHAR2(30)
ksuseunm, -- OSUSER VARCHAR2(30)
ksusepid, -- PROCESS VARCHAR2(12)
ksusemnm, -- MACHINE VARCHAR2(64)
ksusetid, -- TERMINAL VARCHAR2(30)
ksusepnm, -- PROGRAM VARCHAR2(48)
decode -- TYPE VARCHAR2(10)
(bitand (ksuseflg, 19), 17, 'BACKGROUND', 1, 'USER', 2, 'RECURSIVE', '?'),
ksusesql, -- SQL_ADDRESS RAW(4)
ksusesqh, -- SQL_HASH_VALUE NUMBER
ksusepsq, -- PREV_SQL_ADDR RAW(4)
ksusepha, -- PREV_HASH_VALUE NUMBER
ksuseapp, -- MODULE VARCHAR2(48)
ksuseaph, -- MODULE_HASH NUMBER
ksuseact, -- ACTION VARCHAR2(32)
ksuseach, -- ACTION_HASH NUMBER
ksusecli, -- CLIENT_INFO VARCHAR2(64)
ksusefix, -- FIXED_TABLE_SEQUENCE NUMBER
ksuseobj, -- ROW_WAIT_OBJ# NUMBER
ksusefil, -- ROW_WAIT_FILE# NUMBER
ksuseblk, -- ROW_WAIT_BLOCK# NUMBER
ksuseslt, -- ROW_WAIT_ROW# NUMBER
ksuseltm, -- LOGON_TIME DATE
ksusectm, -- LAST_CALL_ET NUMBER
decode -- PDML_ENABLED VARCHAR2(3)
(bitand (ksusepfl, 16), 0, 'NO', 'YES'),
decode -- FAILOVER_TYPE VARCHAR2(13)
(ksuseft, 2, 'SESSION', 4, 'SELECT', 8, 'TRANSACTIONAL', 'NONE'),
decode -- FAILOVER_METHOD VARCHAR2(10)
(ksusefm, 1, 'BASIC', 2, 'PRECONNECT', 4, 'PREPARSE', 'NONE'),
decode -- FAILED_OVER VARCHAR2(3)
(ksusefs, 1, 'YES', 'NO'),
ksusegrp, -- RESOURCE_CONSUMER_GROUP VARCHAR2(32)
decode -- PDML_STATUS VARCHAR2(8)
(bitand (ksusepfl, 16), 16, 'ENABLED', decode (bitand (ksusepfl, 32), 32,
'FORCED', 'DISABLED')),
decode -- PDDL_STATUS VARCHAR2(8)
(bitand (ksusepfl, 64), 64, 'FORCED', decode (bitand (ksusepfl, 128), 128,
'DISABLED', 'ENABLED')),
decode -- PQ_STATUS VARCHAR2(8)
(bitand (ksusepfl, 512), 512, 'FORCED', decode (bitand (ksusepfl, 256), 256,
'DISABLED', 'ENABLED')),
ksusecqd, -- CURRENT_QUEUE_DURATION NUMBER
ksuseclid -- CLIENT_IDENTIFIER VARCHAR2(64)
from
x$ksuse
where
bitand (ksspaflg, 1) !=0 and bitand (ksuseflg, 1) !=0
Комментарии, понятное дело, отображают соответствие полей из x$ksuse полям из gv$session.
Что касается результатов работы скрипта по всем fixed views (и для разных версий Oracle), то они приведены ниже.
- Определения fixed views в Oracle 8i (8.1.7)
- Определения fixed views в Oracle 9i (9.2)
- Определения fixed views в Oracle 10g (10.1)
- Определения fixed views в Oracle 10gr2 (10.2)
- Определения fixed views в Oracle 11gr2 (11.2)
