テーブル圧縮を使用する場合、日付のみを保存するとスペースを節約できます。
以下は、日付のみを保存することでセグメント サイズを縮小できることを示す例です。
create table a (dt date) compress;
create table b (dt date) compress;
--Insert 20 million rows, with time
begin
for i in 1 .. 20 loop
insert /*+ append */ into a
select sysdate + numToDSInterval(level, 'second')
from dual connect by level <= 1000000;
commit;
end loop;
end;
/
--Insert 20 million rows, date only
begin
for i in 1 .. 20 loop
insert /*+ append */ into b
select trunc(sysdate + numToDSInterval(level, 'second'))
from dual connect by level <= 1000000;
commit;
end loop;
end;
/
select segment_name, bytes/1024/1024 MB
from dba_segments
where segment_name in ('A', 'B')
order by segment_name;
SEGMENT_NAME MB
------------ --
A 256
B 224
Oracle の基本的なテーブルの圧縮では、値全体のみが圧縮されます。個別の値が少ない場合は、圧縮がうまく機能します。ただし、圧縮デモを完全に信じてはいけません。確認するには、自分のデータで試してみる必要があります。これは最良のシナリオである可能性があり、圧縮がデータにまったく役立たない可能性があります。
テーブル圧縮には多くの欠点があります。エンタープライズ エディションが必要である、DML が遅い、テーブルに列を追加できないなどです。
また、ベンが提案したように、トリガーの代わりにチェック制約を使用して日付のみのルールを適用する必要があります。これは、よりシンプルで高速になり、基本的なテーブル圧縮を使用するために必要なダイレクト パス書き込みを妨げません。