1.2.8 Exadataハイブリッド・コラム圧縮
Exadata Hybrid Columnar Compressionでは、列編成を使用してデータを格納し、類似した値を近接させることで圧縮率を高めています。
Exadata Hybrid Columnar Compressionを使用すると、データは圧縮ユニットと呼ばれる行のセットに編成されます。圧縮ユニット内では、データは列ごとに編成されてから圧縮されます。各行は圧縮ユニット内で自己完結しています。
データベース操作は圧縮オブジェクトに対して透過的に実行されるため、アプリケーションを変更する必要はありません。データベースでは、任意のSQL操作によって処理されるデータを圧縮しますが、ダイレクト・パス・ロードでは圧縮レベルがより高くなります。
ユーザーの要件に応じて、次のタイプのExadata Hybrid Columnar Compressionを指定できます。
- ウェアハウス圧縮: このタイプの圧縮は、問合せパフォーマンス用に最適化されており、データ・ウェアハウス・アプリケーション向けです。
- アーカイブ圧縮: このタイプの圧縮は、最大の圧縮レベル用に最適化されており、履歴データおよび変更されないデータ向けです。
たとえば、Exadata Hybrid Columnar Compressionをdaily_sales
表に適用するとします。1日の終わりに、品目と販売数が表に移入され、品目IDと日付がコンポジット主キーになります。次の表に、行サブセットを示します。
表1-1 サンプル表daily_sales
Item_ID | Date | Num_Sold | Shipped_From | Restock |
---|---|---|---|---|
1000 |
01-JUN-07 |
2 |
WAREHOUSE1 |
Y |
1001 |
01-JUN-07 |
0 |
WAREHOUSE3 |
N |
1002 |
01-JUN-07 |
1 |
WAREHOUSE3 |
N |
1003 |
01-JUN-07 |
0 |
WAREHOUSE2 |
N |
1004 |
01-JUN-07 |
2 |
WAREHOUSE1 |
N |
1005 |
01-JUN-07 |
1 |
WAREHOUSE2 |
N |
データベースでは、圧縮ユニットと呼ばれる内部構造に行のセットを格納します。たとえば、前述の表の行が1つのユニットに格納されるとします。Exadata Hybrid Columnar Compressionでは、値を行にマップするメタデータとともに、列4の一意の値をそれぞれ格納します。概念上は、圧縮値は次のように表現されます。
WAREHOUSE1WAREHOUSE3WAREHOUSE2
次に、データベースでは、この値で繰り返されているWAREHOUSE
という語を圧縮するために、この語を1回だけ格納し、その各出現箇所を参照で置き換えます。参照のサイズが元の語より小さければ、データベースは圧縮に成功したことになります。圧縮の利点は、一意の値が1つのみ含まれるDate
列で特に明らかです。
次の図に示すように、各圧縮ユニットは、複数のデータ・ブロックにまたがることができます。特定の列の値は、複数のブロックにまたがる場合とまたがらない場合があります。
Exadata Hybrid Columnar Compressionでは、暗黙的に行がロックされます。非圧縮のデータ・ブロックで行の更新が発生した場合、更新される行のみがロックされます。これに対して、更新が圧縮ユニットのいずれかの行で発生した場合、データベースではそのユニットのすべての行をロックする必要があります。Exadata Hybrid Columnar Compressionを使用して行を更新すると、ROWIDが変更されます。
ノート:
表でExadata Hybrid Columnar Compressionを使用する場合、Oracle DMLでは、比較的大きなデータ・ブロック(圧縮ユニット)がロックされるため、同時実行性が低下する可能性があります。Oracle Databaseでは、表の圧縮で4つの方法がサポートされます。
表1-2 表の圧縮方法
表の圧縮方法 | 圧縮レベル | CPUオーバーヘッド | アプリケーション |
---|---|---|---|
基本圧縮 |
高い |
最小 |
DSS |
OLTP圧縮 |
高い |
最小 |
OLTP、DSS |
ウェアハウス圧縮 |
より高い(圧縮レベルは、指定された圧縮レベル(LOWまたはHIGH)に応じて変化します) |
より高い(CPUオーバーヘッドは、指定された圧縮レベル(LOWまたはHIGH)に応じて変化します) |
DSS |
アーカイブ圧縮 |
最高(圧縮レベルは、指定された圧縮レベル(LOWまたはHIGH)に応じて変化します) |
最高(CPUオーバーヘッドは、指定された圧縮レベル(LOWまたはHIGH)に応じて変化します) |
アーカイブ |
ウェアハウス圧縮とアーカイブ圧縮では、Exadata Hybrid Columnar Compressionテクノロジが使用されるため、最高の圧縮レベルが実現します。Exadata Hybrid Columnar Compressionテクノロジでは、行優先ストレージではなく、修正された形式の列指向ストレージが使用されます。これにより、データベースでは、同様のデータをまとめて格納できるため、圧縮アルゴリズムの効率性が向上します。Exadata Hybrid Columnar Compressionでは、DMLでCPUオーバーヘッドが多く必要とされるため、更新頻度の低いデータにのみこの圧縮機能を使用してください。
より高い圧縮レベルのExadata Hybrid Columnar Compressionは、ダイレクト・パス・インサートが行われるデータでのみ実現されます。従来の挿入および更新もサポートされますが、その場合はより低い圧縮形式となり、圧縮レベルも低下します。
次の表は、表の各圧縮方法の特徴を示しています。
表1-3 表の圧縮の特徴
表の圧縮方法 | CREATE/ALTER TABLEの構文 | ダイレクト・パス・インサート | DML |
---|---|---|---|
基本圧縮 |
|
可 |
可 ノート: 挿入および更新された行は圧縮されません。 |
OLTP圧縮 |
|
可 |
可 |
ウェアハウス圧縮 |
|
可 |
可 CPUオーバーヘッドが高くなります。 ノート: 挿入および更新された行は、より低い圧縮形式でブロックに配置されるため、圧縮レベルは低下します。 |
アーカイブ圧縮 |
|
可 |
可 ノート: 挿入および更新された行は圧縮されません。挿入および更新された行は、より低い圧縮形式でブロックに配置されるため、圧縮レベルは低下します。 |
COMPRESS FOR QUERY HIGH
オプションは、デフォルトのデータ・ウェアハウス圧縮モードです。これにより、適切な圧縮およびパフォーマンスが実現します。COMPRESS FOR QUERY LOW
オプションは、ロード・パフォーマンスが非常に重要な環境で使用する必要があります。このオプションでは、COMPRESS FOR QUERY HIGH
オプションで圧縮されたデータより高速にロードが行われます。
COMPRESS FOR ARCHIVE LOW
オプションは、デフォルトのアーカイブ圧縮モードです。これにより、高い圧縮レベルと適切な問合せパフォーマンスが実現します。このオプションは、アクセス頻度の低いデータに適しています。めったにアクセスされないデータに対しては、COMPRESS FOR ARCHIVE HIGH
オプションを使用する必要があります。
DBMS_COMPRESSION
パッケージで提供される圧縮アドバイザを使用すると、特定の表に特定の圧縮方法を適用したときに予想される圧縮レベルを確認できます。
表の圧縮は、CREATE
TABLE
コマンドのCOMPRESS
句で指定します。既存の表で圧縮を有効にするには、ALTER
TABLE
文でこれらの句を使用します。この場合、圧縮の有効後に挿入または更新されたデータのみが圧縮されます。同様に、既存の圧縮表で表の圧縮を無効にするには、ALTER
TABLE
...NOCOMPRESS
コマンドを使用します。この場合、すでに圧縮されているすべてのデータは圧縮されたままですが、新規データは圧縮されずに挿入されます。