0

大きなテーブルの列に文字列値の明確なセットを格納する必要があります。別のルックアップ テーブルを使用せず、FK-PK 関係を設定しない理由を疑問に思われるかもしれません。それには正当な理由があると想像してください。

Oracle はそのような列に圧縮メカニズムを使用していますか? または、それを使用する方法はありますか?

答えが否定の場合、Oracle は値の重複ごとに正確な文字を格納するだけですか? 参照を提供できますか?

4

1 に答える 1

4

日付と同様に、 Oracle はデータを圧縮しません。

簡単な環境のセットアップ:

create table test ( str varchar2(100) );

insert all
  into test values ('aaa')
  into test values ('aba')
  into test values ('aab')
  into test values ('abb')
  into test values ('bbb')
select * from dual;

データ型、バイト単位の長さ、およびデータの内部表現を返すを使用するDUMP()と、次のクエリを使用して格納されている内容を確認できます。

select str, dump(str)
  from test

答えは、どの場合でも 3 バイトが格納されるということです。

+-----+-----------------------+
| STR |       DUMP(STR)       |
+-----+-----------------------+
| aaa | Typ=1 Len=3: 97,97,97 |
| aba | Typ=1 Len=3: 97,98,97 |
| aab | Typ=1 Len=3: 97,97,98 |
| abb | Typ=1 Len=3: 97,98,98 |
| bbb | Typ=1 Len=3: 98,98,98 |
+-----+-----------------------+

SQL フィドル

jonearles がリンクされた回答で示唆しているように、テーブル圧縮を使用して格納されるバイト数を減らすことができますが、多くのトレードオフがあります。代わりに、次のようにテーブルを宣言します。

create table test ( str varchar2(100) ) compress;

ドキュメントのすべての警告と jonearles の回答に注意してください。ここに投稿するには多すぎます。

この方法で数バイトを保存する必要がある可能性はほとんどありません。

于 2013-06-30T11:47:05.640 に答える