DB2 Spatial Extender による空間インデックスの作成

IBM DB2 Spatial Extender は、アプリケーションが空間列に含まれている 2 次元の地理データを検索し、特定の範囲内にあるすべてのジオメトリをすばやく特定できるようにするための、3 層グリッド空間インデックスを提供します。

2 次元の空間インデックスは、DB2 で提供される従来の階層型の B ツリー インデックスとは異なります。空間列に 2 次元の特性を持たせるには空間インデックスの構造が必要なので、B ツリー インデックスを空間列に適用することはできません。同じ理由から、空間インデックスを非空間列に適用することもできません。また、空間インデックスを何らかのコンポジット列に適用することもできません。

このため、空間インデックスの CREATE INDEX ステートメントに USING 句を追加して、DB2 に B ツリー インデックスではなく Spatial Extender の空間インデックスを使用させる必要があります。完全な構文は次のとおりです。

CREATE INDEX <index_name> 
ON <table> (<spatial column>)
USING db2gse.spatial_index (<grid level 1>, [grid level 2], [grid level 3])

USING 句を追加すると、空間インデックスと B ツリー インデックスが区別されます。このステートメントに現在の関数パスが反映されないよう、db2gse スキーマ名で spatial_index エクステンション名を修飾する必要があります。

B ツリー インデックスを使用するデータは本質的に単純なので、データベース設計者は DB2 のテーブルの列にインデックスを 1 つ以上作成するだけで済みます。これに対し、空間データは複雑なので、データベース設計者はその相対的なサイズ分布を理解する必要があります。データベース設計者は、空間インデックスの最適なサイズとグリッド レベルの数を決定しなければなりません。

グリッド レベル([グリッド レベル 1]、[グリッド レベル 2]、[グリッド レベル 3])を入力するには、セルのサイズを増やします。したがって、レベル 2 のサイズはレベル 1 のサイズよりも大きくなければならず、レベル 3 のサイズはレベル 2 のサイズよりも大きくなければなりません。レベル 1 のグリッド セルは必須ですが、レベル 2 とレベル 3 のグリッド セルは 0 の値を指定して無効にすることができます。

Spatial Extender が空間インデックスを生成する仕組み

DB2 Spatial Extender は、空間インデックスを次のように生成します。

  1. レベル 1 のグリッドを先頭に、各ジオメトリのエンベロープとグリッドを交差させます。
  2. レベル 1 のグリッドとの交差が 4 未満の場合、Spatial Extender はジオメトリ ID と交差するグリッド セルの ID を空間インデックスに入力し、次のジオメトリに進みます。
  3. レベル 1 のグリッドとの交差が 4 以上の場合は、そのジオメトリをレベル 2 のグリッドと交差させます。レベル 2 のグリッドを有効にしていない場合、Spatial Extender はジオメトリ ID とグリッド セルの ID を空間インデックスに入力し、次のジオメトリに進みます。
  4. レベル 2 のグリッドとの交差が 4 未満の場合、Spatial Extender はジオメトリ ID と交差するグリッド セルの ID を空間インデックスに入力し、次のジオメトリに進みます。
  5. レベル 2 のグリッドとの交差が 4 以上の場合は、そのジオメトリをレベル 3 のグリッドと交差させます。レベル 3 のグリッドを有効にしていない場合、Spatial Extender はジオメトリ ID とグリッド セルの ID を空間インデックスに入力し、次のジオメトリに進みます。
  6. Spatial Extender は、ジオメトリ ID と交差するレベル 3 のグリッド セルの ID を空間インデックスに入力し、次のジオメトリに進みます。

Spatial Extender は、実際にはポリゴン グリッド構造を一切作成しません。列の空間参照系の XY オフセットを原点として定義し、座標の正の座標空間に展開することで、グリッド レベルをパラメータ化します。グリッド サイズをパラメータとして、交差を数学的に生成します。

Spatial Extender が空間インデックスを使用する仕組み

Spatial Extender は、空間インデックスを使用して空間検索のパフォーマンスを向上させます。矩形検索(最も基本的で最もよく使用される空間クエリ)は、ユーザ定義ボックスと交差する空間列のジオメトリを返します。空間インデックスが存在しない場合、Spatial Extender はボックス内のすべての空間列のジオメトリを比較しなければなりません。

Spatial Extender は空間インデックスを使用して、ボックスと交差するグリッドを特定することができます。空間インデックスはグリッドの順に並んでいるため、Spatial Extender はすべての候補ジオメトリをすばやく取得することができます。このプロセスはファースト パス(first pass)と呼ばれます。

セカンド パス(second pass)では、候補ジオメトリのリストを走査して、エンベロープがボックスと交差しないジオメトリを候補から外します。

サード パス(third pass)では、候補ジオメトリの実際の座標をボックスと比較して、ジオメトリがボックスと交差するかどうかを判断します。この最後の複雑な比較は、最初の 2 つのパスでかなり絞り込まれたテーブル行のサブセットに対して実行されます。

すべての空間クエリは 3 つのパスを実行しますが、EnvelopesIntersect 関数は例外で、最初の 2 つのパスだけを実行します。EnvelopesIntersect は表示処理に使用される関数で、ディスプレイ クリッピング ルーチンを使用し、サード パスの精度を必要としません。

最適なグリッド セル サイズ

不規則な形状のジオメトリのエンベロープがグリッド セルにうまく収まらないことは、グリッド セル サイズの選択を困難にしています。この不規則性により、複数のグリッドと交差するジオメトリ エンベロープもあれば、1 つのグリッド セルにすっぽりと収まるジオメトリ エンベロープもあります。逆に、空間データの分布状況によっては、グリッド セルが複数のジオメトリ エンベロープと交差することもあります。

空間インデックスがうまく機能するのは、適切なレベル数のグリッドを有効にし、それらのセル サイズをデータに適合させた場合です。これを理解するために、まず、サイズが統一されたジオメトリを持つ空間列について考えてみます。この場合は、グリッド レベルは 1 つで十分なので、マルチレベルの空間インデックスを作成する必要はありません。グリッド レベル 1 の空間インデックスを作成し、グリッド セルのサイズをジオメトリ エンベロープの平均サイズの 1.5 倍に設定します。

ヒントヒント:

ポイント データのエンベロープは小さいので、グリッド サイズもまた小さくなります。

原則として、グリッド サイズは標準的なクエリ ウィンドウ サイズの 1/10 のサイズに設定する必要があります。ポイント データの場合、グリッド レベルは 1 つで十分です。

アプリケーションをテストしていて、グリッド セルのサイズを大きくすると、パフォーマンスが向上することがあります。これは、各グリッド セルがより多くのジオメトリを参照するようになり、ファースト パスの段階で不適格なジオメトリを破棄できるためです。ただし、グリッド セルのサイズを大きくし続けると、セカンド パスで選別されるジオメトリの数が増えるため、パフォーマンスが低下します。

DB2 Spatial Extender には、Index Advisor というユーティリティがあります。このユーティリティを使用すれば、仮のグリッド インデックスを作成し、このインデックスを実際のインデックスのモデルとしてチューニングすることができます。また、既存のグリッド インデックスを維持するか、置き換えるかを判断することもできます。

次に、Index Advisor を使用して、既存のグリッド インデックスの詳細情報を取得する例を示します。この例では、グリッド インデックスの完全修飾名は mydb.myindex です。

gseidx connect to mydb user test using test get geometry statistics for index mydb.myindex detail

shp2sde と cov2sde は、-g オプションが指定されない場合に、同様のアルゴリズムを使用して、レベル 1 のグリッド サイズでデフォルトの空間インデックスを計算します。レベル 2 およびレベル 3 のグリッド サイズのデフォルトは、常に 0 に設定されています。この場合、shp2sde はシェープファイルの範囲を使用し、cov2sde は ArcInfo カバレッジの範囲を使用します。shp2sde コマンドと cov2sde コマンドを使用する方法については、『ArcSDE コマンド リファレンス』をご参照ください。

レベル数の選択

空間列には、同じ相対サイズのジオメトリはほとんど含まれていません。ただし、ほとんどの空間列のジオメトリは、いくつかのサイズごとにグループ化することができます。たとえば、小さな土地区画が大量に含まれた都市の土地区画の空間列があり、それらの小さな土地区画が都心部に散らばっていて、その周辺に大きな郊外土地区画がいくつかあるとします。これはよくある状況であり、マルチレベルの空間インデックスが必要です。各レベルのグリッド セルのサイズを選択するには、ジオメトリ エンベロープのサイズの間隔を割り出します。そして、それらの間隔よりも少し大きいセル サイズで、空間インデックスを作成します。アプリケーションを使用して空間列に空間検索を実行し、インデックスをテストします。グリッド サイズを少しずつ調整しながら、パフォーマンスが向上するかどうかを確認します。

このトピックの詳細については、『IBM DB2 Spatial Extender ユーザーズ ガイド』の「第 11 章 索引およびビューを使用した地理情報データへのアクセス」をご参照ください。


3/6/2012