Oracle Database 中關(guān)于null值的存儲

這里主要驗證了number 和 varchar2 兩種數(shù)據(jù)類型null值的存儲 先來介紹一下row piece的結(jié)構(gòu) 引用官方文檔的一張結(jié)構(gòu)圖 通常情況下,不包括(cluster table 和 chain row)一個rowpiece 包括row header 和 column data 關(guān)于其他情況,會在以后的研究中陸續(xù)放

?

這里主要驗證了number 和 varchar2 兩種數(shù)據(jù)類型null值的存儲

先來介紹一下row piece的結(jié)構(gòu)

?

?

引用官方文檔的一張結(jié)構(gòu)圖

Oracle Database 中關(guān)于null值的存儲


?

?

通常情況下,不包括(cluster table 和 chain row)一個rowpiece 包括row header 和 column data

關(guān)于其他情況,會在以后的研究中陸續(xù)放出。

BBED> dump /v
File: /u01/apps/oracle/oradata/david/users01.dbf(4)
Block: 531? ???Offsets: 8173to 8191??Dba:0x01000213
——————————————————-
3c020302 c1020353 59530444 55414c01 l<...>
06fbd4? ?? ???? ?? ?? ?? ?? ???? ?l .??

例如:一個rowpiece的前3個字節(jié) 3c0203它表示

1個字節(jié)的flag
1個字節(jié)的lb(itl slot)
1個字節(jié)的columncount

如例中
3c=flag=00111100=–HDFL–=header+delete+first+last
02=lb itl slot 0x02
03=column count

列值信息包括:
列的長度,列的value
例如02c102
表示占用2個byte
c102 表示的是具體的值

dump 的信息 可以使用 UTL_RAW.CAST_TO_xxxx 來翻譯(感謝itpub?iori809的指導)

?

?

Oracle Database 中關(guān)于null值的存儲

?

下面開始驗證

首先環(huán)境為11.1.0.6 linux x64

  1. dex@FAKE>?desc?ts??
  2. ?Name??????????????????????????????????????????????????????????????Null?????Type??
  3. ?—————————————————————–?——–?——————————————–???
  4. ?ID?????????????????????????????????????????????????????????????????????????NUMBER??
  5. ?NAME???????????????????????????????????????????????????????????????????????VARCHAR2(20)??
  6. ?COUNT??????????????????????????????????????????????????????????????????????NUMBER??
  7. ??
  8. ??
  9. dex@FAKE>?select?t.*,??
  10. ??2?????????dbms_rowid.rowid_relative_fno(t.rowid)?as?“FNO#”,??
  11. ??3?????????dbms_rowid.rowid_block_number(t.rowid)?as?“BLK#”,??
  12. ??4?????????dbms_rowid.rowid_row_number(t.rowid)?as?“ROW#”??
  13. ??5????from?dex.ts?t??
  14. ??6??;??
  15. ??
  16. ??
  17. ????????ID?NAME??????????????????????COUNT???????FNO#???????BLK#???????ROW#??
  18. ———-?——————–?———-?———-?———-?———-???
  19. ?????????1?dd???????????????????????????????????????4?????????31??????????0??
  20. ?????????2???????????????????????????????2??????????4?????????31??????????1??
  21. ???????????2?????????????????????????????3??????????4?????????31??????????2??
  22. ?????????4??????????????????????????????????????????4?????????31??????????3??

?

建表語句:dex@FAKE> create table ts ( id number , name varchar2(20) , count number ) ;
因為表中沒有使用long 類型的column,所以表中列的順序和建表中的列的聲明順序相同。
BBED> set dba 4,31
? ? ? ? DBA ? ? ? ? ? ? 0x0100001f (16777247 4,31)
BBED> map
?File: /u01/apps/Oracle/oradata/fake/users01.dbf (4)
?Block: 31 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Dba:0x0100001f
————————————————————
?KTB Data Block (Table/Cluster)


?struct kcbh, 20 bytes ? ? ? ? ? ? ? ? ? ? ?@0 ? ? ??


?struct ktbbh, 72 bytes ? ? ? ? ? ? ? ? ? ? @20 ? ? ?


?struct kdbh, 14 bytes ? ? ? ? ? ? ? ? ? ? ?@100 ? ??


?struct kdbt[1], 4 bytes ? ? ? ? ? ? ? ? ? ?@114 ? ??


?sb2 kdbr[3] ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?@118 ? ??


?ub1 freespace[8036] ? ? ? ? ? ? ? ? ? ? ? ?@124 ? ??


?ub1 rowdata[28] ? ? ? ? ? ? ? ? ? ? ? ? ? ?@8160 ? ?


?ub4 tailchk ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?@8188 ? ?

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點贊8 分享