Oracle NULLも容量として加算されるテーブル構成
NULL許容のカラムの後にNOT NULL制約のついたカラムがあるとNULL値も容量を使ってしまう。
- テーブル作成
create table nullfirst ( id number, [PRIMARY KEY] id2 number, [NULL許容] id3 number, [NULL許容] id4 number, [NULL許容] idnotnull number not null,[NOT NULL制約] constraint pk_nullfirst primary key(id) ); create table nulllast ( id number, [PRIMARY KEY] idnotnull number not null,[NOT NULL制約] id2 number, [NULL許容] id3 number, [NULL許容] id4 number, [NULL許容] constraint pk_nulllast primary key(id) );
- 1千万行インサートする。(NULL許容のカラムはすべてNULLとする)
insert into nullfirst (id,idnotnull) select level,level from dual connect by level <=10000000; insert into nulllast (id,idnotnull) select level,level from dual connect by level <=10000000; select count(*) from nullfirst; COUNT(*) ---------- 10000000 select count(*) from nulllast; COUNT(*) ---------- 10000000
- サイズを確認
>select SEGMENT_NAME,BYTES,BLOCKS,EXTENTS from user_segments where SEGMENT_NAME in ('NULLLAST','NULLFIRST'); SEGMENT_NAME BYTES BLOCKS EXTENTS -------------- ---------- ---------- ---------- NULLLAST 192937984 23552 94 NULLFIRST 276824064 33792 104
同じデータ量のはずなのにNULLFIRST
テーブルのほうがNULLも容量として加算され容量が多くなる。
よって、無駄な容量を節約するにはNULLを許容し、データのほとんどがNULLとなるカラムは後ろにもってきたほう無難そう。