1.4 ストレージ索引について
HDFSに格納されているデータの場合、Oracle Big Data SQLでは、Oracle Databaseに対して透過的なストレージ索引が自動的に管理されます。ストレージ索引には、HDFSに格納されているデータに関するハード・ディスク上のデータ分散のサマリーが含まれています。ストレージ索引により、I/O操作とフラット・ファイルからOracle Databaseブロックにデータを変換するCPUコストを減らすことができます。ストレージ索引を"否定の索引"と考えることができます。Smart Scanは、ストレージ索引からデータがデータのブロック内にないことがわかるため、そのブロックを読み飛ばすことができます。これにより、I/Oを大幅に回避できます。
ストレージ索引は、HDFSに基づいた外部表、またはORACLE_HDFSドライバとORACLE_HIVEドライバのどちらかを使用して作成された外部表に対してのみ使用できます。ストレージ索引は、オブジェクト・ストアに基づく外部表や、Apache HBaseやOracle NoSQLなどのStorageHandlerを使用する外部表には使用できません。
ストレージ索引はインメモリー領域索引を収集したもので、各領域索引には最大32列のサマリーが格納されています。各分割に領域索引が1つあります。1つの領域索引に格納されているコンテンツは、その他の領域索引とは無関係です。これにより拡張性が高まり、ラッチ競合を回避できます。
各領域索引では、ストレージ索引が領域の列の最小値と最大値を管理します。最小値および最大値は、不要なI/Oの回避に使用されます。これは、I/Oフィルタリングとも呼ばれます。V$SYSSTAT
ビューにあるストレージ索引統計別に保存されたセルのXTグラニュルI/Oバイト数は、ストレージ索引を使用して保存されたI/Oのバイト数を示したものです。
次の比較を使用する問合せはストレージ索引によって改善されます。
-
等価(=)
-
非等価(<、!=または>)
-
以下(<=)
-
以上(>=)
-
IS NULL
-
IS NOT NULL
Oracle Big Data SQLサービスが受け取った問合せに含まれる比較述語が領域の列の最大値よりも大きい場合や最小値よりも小さい場合に、ストレージ索引が自動的に構築されます。
ノート:
-
WHERE問合せ句に頻繁に出現する列に基づいて表内の行を順序付けると、ストレージ索引の効果が上がります。
-
ストレージ索引は、すべての非言語データ型で動作し、非言語索引に似た言語データ型でも動作します。
例1-1 ストレージ索引を使用したディスクI/Oの回避
次の図に、表および領域索引を示します。この表の列Bには、1から8までの範囲の値があります。一方の領域索引には最小値として1、最大値として5が格納されています。もう一方の領域索引には、最小値として3、最大値として8が格納されています。
SELECT *
FROM TABLE
WHERE B < 2;
例1-2 ストレージ索引とブルーム・フィルタの使用
ストレージ索引を使用すると、表の結合で不要なI/O操作をスキップできます。たとえば、次の問合せでは、I/O操作を実行し、ファクト表の最初のブロックにのみブルーム・フィルタを適用しています。ブルーム・フィルタは、結合パフォーマンスの向上のために重要です。この例では、ファクト表ではなくディメンション表に述語があります。ブルーム・フィルタは"dim.name=Hard drive
"に基づいて作成されて、このフィルタがファクト表に適用されます。そのため、ディメンション表にフィルタがある場合でも、ディメンション問合せの結果に基づいて、そのソース(つまりHadoop)でデータにフィルタを適用できます。これにより、関係するストレージ索引などの最適化も可能になります。
SELECT count(*)
FROM fact, dimension dim
WHERE fact.m=dim.m and dim.product="Hard drive";
ファクト表の2番目のブロックに対するI/Oは、最小値/最大値の範囲(5,8)がブルーム・フィルタに存在しないため、ストレージ索引によって完全に回避されます。