5.5.1 レンジインデクスを定義する際の考慮点
(1) レンジインデクスを定義した方がよいケース
レンジインデクスを使用した検索では,レンジインデクスを定義した列の値域を基に検索データを絞り込みます。そのため,次に示すような場合にレンジインデクスを定義します。
-
入力データファイル中のデータが昇順(降順でもよい)に格納されている,またはそれに近い形で格納されている列がある場合
例えば,表にデータの取得日を格納する列があり,データの取得日が昇順または降順に近い形で入力データファイルに格納されている場合,その列にレンジインデクスを定義すると効果があります。例を次の図に示します。
図5‒10 レンジインデクスを定義した方がよいケース(その1) 表を検索する際,レンジインデクスを定義した列(上記の図のC2列)を検索条件に指定します。ただし,指定した検索条件によっては,レンジインデクスが使用されないこともあります。レンジインデクスが使用される条件については,マニュアルHADB AP開発ガイドのSQL文の実行時に使用されるレンジインデクスを参照してください。
-
入力データファイルごとに,ある決まった範囲のデータが格納されている列がある場合
例えば,表に商品番号を格納する列があり,入力データファイルごとに商品番号の値の範囲がある程度決まっている場合,その列にレンジインデクスを定義すると効果があります。例を次の図に示します。
図5‒11 レンジインデクスを定義した方がよいケース(その2) 表を検索する際,レンジインデクスを定義した列(上記の図のC2列)を検索条件に指定します。ただし,指定した検索条件によっては,レンジインデクスが使用されないこともあります。レンジインデクスが使用される条件については,マニュアルHADB AP開発ガイドのSQL文の実行時に使用されるレンジインデクスを参照してください。
-
バックグラウンドインポートで格納するデータがチャンク間で重複しない場合
例えば,センサから発生したデータ(1日分)を,毎日バックグラウンドインポートで表に格納するとします。バックグラウンドインポート対象の表に,データの発生日時を格納する列がある場合,その列にレンジインデクスを定義すると効果があります。例を次の図に示します。
図5‒12 レンジインデクスを定義した方がよいケース(その3) - [説明]
-
1つの入力データファイルには1日分のデータが格納されています。バックグラウンドインポートを実行した場合,C2列に格納される「データの発生日時」のデータは,各チャンクで重複しません。
この場合,チャンクごとに値域が管理されているため,探索条件を満たさない値域のデータを格納しているチャンクの検索処理をスキップできます。そのため,効率良く検索できます。
表を検索する際,レンジインデクスを定義した列(上記の図のC2列)を検索条件に指定します。ただし,指定した検索条件によっては,レンジインデクスが使用されないこともあります。レンジインデクスが使用される条件については,マニュアルHADB AP開発ガイドのSQL文の実行時に使用されるレンジインデクスを参照してください。
(2) レンジインデクスを定義しない方がよいケース
次に示すような場合は,各セグメントの値域が広がるため,レンジインデクスを定義しても,セグメントのスキップの効果が期待できません。
-
入力データファイル中のデータが,昇順または降順に近い形で並んでいる列がない場合
-
行の追加,更新,削除を頻繁に行う場合
なお,行を削除する場合は,セグメントの値域は広がりませんが,セグメント内に格納されているデータの値域に比べて,レンジインデクスの値域が広くなるため,レンジインデクスの効果が期待できません。
また,次に示すような場合は,各チャンクの値域が重複するため,レンジインデクスを定義しても,チャンクのスキップの効果が期待できません。
-
バックグラウンドインポートを適用したデータインポートで格納するデータが,チャンク間で重複する場合
セグメントのスキップ,およびチャンクのスキップのどちらの効果も期待できない列には,レンジインデクスを定義しないようにしてください。検索性能が低下する原因になります。
(3) レンジインデクスを定義できない列
次に示す条件を満たす列にレンジインデクスは定義できません。
-
定義長が33バイト以上のCHAR型の列
-
VARCHAR型の列
-
BINARY型の列
-
VARBINARY型の列