例: Tessellate関数 - Teradata Database - Teradata Vantage NewSQL Engine

Teradata Vantage™ 地理空間データ型

Product
Teradata Database
Teradata Vantage NewSQL Engine
Release Number
16.20
Published
2019年3月
Language
日本語
Last Update
2019-10-29
dita:mapPath
ja-JP/swn1512082023009.ditamap
dita:ditavalPath
ja-JP/swn1512082023009.ditaval
dita:id
B035-1181
Product Category
Software
Teradata Vantage

2つのテーブル、P500000およびR5000について考察します。どちらのテーブルにも地理空間形状の列が格納されています(テーブルP500000の列AおよびテーブルR5000の列B)。

説明を簡単にするために、2つのテーブルには同様の形状のMBR(最小外接矩形)が用意されていることにします。ただし、テセレーション関数に形状の情報を含むMBRを渡して、最後のWHERE句にあるST_Overlapsメソッドで2つの形状の重なりを比較すると、あらゆるタイプの形状も使用できるようになります。

次に示す文では、2つのテーブルで重なるオブジェクトの数をカウントしています。

   SELECT COUNT(*)
   FROM ( SELECT *
          FROM P500000 A
              ,TABLE(tessellate(A.rkey, A.xmin, A.ymin, A.xmax, A.ymax,
                                0, 0, 100, 100, 100, 100 ) )T1
          WHERE A.rkey = T1.out_key ) S1
       ,( SELECT *
          FROM R5000 B
              ,TABLE( Tessellate(B.rkey, B.xmin, B.ymin, B.xmax, B.ymax,
                                 0, 0, 100, 100, 100, 100 ) )T2
          WHERE B.rkey = T2.out_key )S2							
   WHERE S1.cellid = S2.cellid
      AND S1.xmax >= S2.xmin and S1.xmin <= S2.xmax
      AND S1.ymax >= S2.ymin and S1.ymin <= S2.ymax;
上記の例で、テセレーションの動作の仕組みを説明します。
  1. まず、2つのテーブルに含まれる形状の母領域を収容するのに十分な大きさの、テセレーション グリッドを定義します。次に、典型的な空間オブジェクトに指定する適当な粒度を定義します。この例では、グリッドのサイズは、母領域のMBR (0,0から100,100)で定義されているように100x100です。また、グリッドのxおよびy方向の数は、どちらも100になるように定義されています。
  2. 最初のSELECT文では、P500000から1行ずつ選択しています。 各行に対して、tessellateテーブル関数を呼び出して、空間オブジェクトを含むセルIDのテーブルを取得しています。 これにより、空間オブジェクトと、それを含むセルのテーブル(S1)が生成されます。 例えば、P500000のある行が処理されて空間オブジェクトが4つのセルになると、それぞれが同じ空間オブジェクトとセルIDを持つ4つの行がS1に追加されることになります。 これが、P500000に含まれるすべての行に対して続けられます。
  3. 2番目のSELECT文では、最初のSELECT文と同じ方法でテーブルR5000に対する処理が実行され、結果がS2に格納されます。
  4. この時点で、2つの表S1とS2が存在しています。次に、最後のWHERE句で、セルIDによりS1とS2を結合するため、MBR形状が単純になり、重複を計算する処理が単純になります。これにより、2つの形状が重なっている場合に行が生成されます。重複計算にはコストがかかると仮定すると、同じセルにある空間オブジェクトのみが重複計算で比較されることでパフォーマンスが向上することになります。重複計算は、他のオブジェクトと物理的に近接していないオブジェクトに対して実行されることはありません。