読者です 読者をやめる 読者になる 読者になる

kenken0807_DBメモ

つば九郎が好きなDBAです。Oracle Standard Editionでの運用やツールとかとかの備忘録。特に記載がない場合はoracle11gR2です。時々MySQL

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となるカラムは後ろにもってきたほう無難そう。