прямой доступ к SGA / адреса полей в x$ksuse
На первый взгляд, нелёгкая это задача -- узнавать адреса полей в x$ksuse.
Но здесь на помощь нам приходят две "волшебные" таблицы x$kqfta (kernel query
fixed tables) и x$kqfco (kernel query fixed tables column definitions), без
которых вся идея прямого чтения SGA была бы практически обречена на провал.
Но используя эти таблицы мы с лёгкостью получаем необходимые данные:
SQL> select c.kqfconam field_name, 2 c.kqfcooff offset, 3 c.kqfcosiz sz 4 from x$kqfco c,x$kqfta t 5 where t.indx = c.kqfcotab and t.kqftanam='X$KSUSE' 6 order by offset; FIELD_NAME OFFSET SZ ------------------------------ ---------- ---------- ADDR 0 4 INDX 0 4 INST_ID 0 4 KSUSEPRO 0 4 KSSPATYP 0 4 KSUSECTM 0 4 KSUSECQD 0 4 KSSPAFLG 1 1 KSSPAOWN 4 4 KSUUDSES 24 4 KSUUDUID 28 4 KSUUDLUI 32 4 KSUUDNAM 36 30 KSUUDLNA 67 30 KSUUDPRV 104 1 KSUUDOCT 105 1 KSUUDFLG 108 4 KSUUDPFN 152 4 KSUUDSID 160 4 KSUUDSNA 164 30 KSUSEGRP 198 32 KSUSETRN 228 4 KSUSEBRN 232 4 KSUSENUM 1380 2 KSUSESER 1382 2 KSUSEFLG 1388 4 KSQPSWAT 1416 4 KSUSEIDL 1420 1 KSUSESOW 1484 4 KSUSESQL 1500 4 KSUSESQH 1504 4 KSUSEUNM 1528 30 KSUSEMNM 1564 64 KSUSETID 1632 30 KSUSEPID 1668 12 KSUSEPNM 1684 48 KSUSEFIL 1740 2 KSUSEBLK 1744 4 KSUSESLT 1748 2 KSUSEOBJ 1752 4 KSUSEAPP 1756 48 KSUSEAPH 1808 4 KSUSEACT 1812 32 KSUSEACH 1848 4 KSUSEFIX 1852 4 KSUSECLI 1856 64 KSUSELTM 2084 7 KSUSEPSQ 2096 4 KSUSEPHA 2100 4 KSUSEPFL 2108 4 KSUSEQCSID 2120 2 KSUSEFT 2196 4 KSUSEFM 2200 4 KSUSEFS 2204 4 KSUSETMC 2348 4 KSUSECLID 2356 64 KSUSEPGAMAN 2360 4 KSUSEPGAAUTO 2364 4 58 rows selected.
Всё!
Здесь можно добавить, что поля со смещением 0 не хранятся
в рамках данной структуры, а вычисляются Oracle'ом динамически.
И ещё, обратите внимание на поле KSUSECLID. Оно начинается со смещения 2356
и имеет длину 64. Получается, что оно заканчивается на смещении 2420. Но
ранее мы узнали, что размер записи в x$ksuse
равен 2408 байт, что меньше чем 2420! Как такое может быть?
Краткое объяснение (а полное пока выходит за рамки этой статьи) здесь такое:
по смещению 2356 хранится не значение поля, а его адрес.