2

私はこのリンクこれを見ました:

時刻コンポーネントなしで日付値を指定すると、デフォルトの時刻は午前 0 時になります。日付を指定せずに日付値を指定すると、デフォルトの日付は現在の月の最初の日になります。

Oracle DATE 列には、常に日付と時刻の両方のフィールドが含まれます。クエリで時刻部分のない日付形式を使用する場合は、DATE 列の時刻フィールドが午前 0 時に設定されていることを確認する必要があります。

解決策は、日付データ型の列に制約を設定しTRUNC()、テーブルの行を挿入または更新するときにトリガーを作成することです ( を使用)。

このソリューションを使用した場合、Oracle が時刻のない日付に対してより少ないバイト数を格納するという保証はありますか?

この標準の日時型を使用すると、Oracle はあいまいさを生み出します。日付型 (日付のみを含む) を作成するのはとても難しいですか? これは私の意見です (私は MSSQL から来ました)。

4

2 に答える 2

1

テーブル圧縮を使用する場合、日付のみを保存するとスペースを節約できます。

以下は、日付のみを保存することでセグメント サイズを縮小できることを示す例です。

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 が遅い、テーブルに列を追加できないなどです。

また、ベンが提案したように、トリガーの代わりにチェック制約を使用して日付のみのルールを適用する必要があります。これは、よりシンプルで高速になり、基本的なテーブル圧縮を使用するために必要なダイレクト パス書き込みを妨げません。

于 2013-06-13T05:02:48.123 に答える