1.2.15 ストレージ索引

Oracle Exadata Storage Serverはディスク上のデータ分散のサマリーを含むストレージ索引を管理します。

ストレージ索引は自動的に管理され、Oracle Databaseに対して透過的です。これはメモリー内領域の索引を収集したもので、Exadata 12.2.1.1.0より前は、領域索引ごとに最大8列のサマリーが格納されていましたが、Exadata 12.2.1.1.0からは、領域索引ごとに最大24列のサマリーを格納できます。セット・サマリーを使用する場合は、最大数の24に達しないことがあります。ディスク上の各1MBの領域に領域索引が1つあります。ストレージ索引は、すべての非言語データ型で動作し、非言語索引に似た言語データ型でも動作します。

各領域索引では、表の列の最小値および最大値を管理します。最小値および最大値は、不要なI/Oの回避に使用されます。これは、I/Oフィルタリングとも呼ばれます。V$SYS_STATビューおよびV$SESSTATビューにあるCell physical IO bytes saved by storage index統計には、ストレージ索引を使用して保存されたI/Oのバイト数が表示されます。1つの領域索引に格納されているコンテンツは、その他の領域索引とは無関係です。これにより高スケーラブルとなり、ラッチの競合が回避されます。

次の比較を使用した問合せは、ストレージ索引によって改善されています。

  • 等価(=)

  • 不等価(<、!=、>)

  • 以下(<=)

  • 以上(>=)

  • IS NULL

  • IS NOT NULL

Oracle Exadata System Softwareでは、領域内の列の最大値よりも大きいか、最小値よりも小さいという比較述語が指定された問合せの後、ストレージ索引が存在していれば効果があるとみなされる場合に、自動的にストレージ索引を作成します。Oracle Exadata System Softwareでは、どのストレージ索引が問合せに効果があったかを自動的に学習し、その情報に基づいてストレージ索引を自動的に作成するため、似たような問合せを今後受け取った場合に効果的です。

Oracle Exadata System Softwareリリース12.2.1.1.0以降では、インメモリー形式の列指向キャッシュを使用してデータが格納されている場合、Oracle Exadata Database Machineは、ディクショナリ・エンコーディングを使用して圧縮されたこれらの列を格納します。固有値が200個より少ない列の場合、ストレージ索引は、ディクショナリの非常にコンパクトなインメモリー表現を作成し、このコンパクトな表現を使用して等価条件に基づいてディスク読取りをフィルタ処理します。この機能は、セット・メンバーシップと呼ばれます。より制限されたフィルタ処理機能が、固有値400個まで拡張されています。

たとえば、ディスクの1リージョンで米国およびカナダの顧客のリストを保持しているとします。メキシコの顧客を検索する問合せを実行する場合は、Oracle Exadata Storage Serverで、新しいセット・メンバーシップ機能を使用して、メキシコからの顧客を含まないディスク・リージョンを除外することで、問合せのパフォーマンスを向上させることができます。セット・メンバーシップ機能がない、12.2.1.1.0より前のリリースのOracle Exadata System Softwareでは、通常のストレージ索引でこれらのディスク・リージョンをフィルタ処理できません。

ノート:

問合せのWHERE句に頻繁に出現する列に基づいて行を順序付けると、ストレージ索引の効果が上がります。

ノート:

ストレージ索引は、圧縮されていないブロックおよびOLTPの圧縮されたブロックへの書込み操作中に管理されます。Exadata Hybrid Columnar Compressionによって圧縮されたブロックまたは暗号化された表領域への書込み操作は、領域索引と特定の領域のストレージ索引のみを無効化します。Exadata Hybrid Columnar Compression用のストレージ索引は、後続のスキャンで再構築されます。

例1-1 ストレージ索引を使用したディスクI/Oの回避

次の図は、表および領域索引を示しています。表内の値の範囲は1から8までです。一方の領域索引には最小値として1、最大値として5が格納されています。もう一方の領域索引には、最小値として3、最大値として8が格納されています。

SELECT * FROM TABLE WHERE B<2などの問合せの場合、最初の行セットのみが一致します。2番目の行セットの最小値と最大値は問合せのWHERE句と一致しないため、ディスクI/Oが回避されます。

例1-2 ストレージ索引から得られるパーティション・プルーニングのような効果

次の図には、Order_NumberOrder_DateShip_DateおよびOrder_Item列があるOrdersという表があります。表はOrder_Date列によってレンジ・パーティションされています。

次の問合せは2015年1月1日以降のオーダーを検索します。

SELECT count (*) FROM Orders WHERE Order_Date >= to_date ('2015-01-01', \
'YYY-MM-DD')

表はOrder_Date列でパーティション化されているため、この問合せは表の不要なパーティションのスキャンを回避します。Order_Dateのパーティション化はShip_Dateに対する問合せに効果があるわけではありませんが、Ship_DateOrder_NumberOrder_Dateと密に相関しています。ストレージ索引では、パーティション化またはソート・ロードによって作成された順序付けを利用し、それを表内の他の列で使用できます。これにより、Ship_Date列およびOrder_Number列に対する問合せでパーティション・プルーニングのようなパフォーマンスが実現されます。

例1-3 ストレージ索引による結合パフォーマンスの向上

ストレージ索引を使用すると、表の結合で不要なI/O操作をスキップできます。たとえば、次の問合せでは、I/O操作を実行し、ファクト表の最初のブロックにのみブルーム・フィルタを適用しています。

SELECT count(*) FROM fact, dim WHERE fact.m=dim.m AND dim.product="Hard drive"

ファクト表の2番目のブロックに対するI/Oは、最小値/最大値の範囲(5,8)がブルーム・フィルタに存在しないため、ストレージ索引によって完全に回避されます。