修正されたプレオーダー ツリーを使用して、アプリケーションの GEO ロケーションを単一のテーブル LOC_TABLE に格納します。たとえば、ギリシャのサブツリーの例は次のようになります。
+-------+---------------+-----+-----+------+
| ID | NAME | LFT | RGT | TYPE |
+-------+---------------+-----+-----+------+
| 10 | Greece | 100 | 200 | 3 |
| 20 | Crete Isl. | 120 | 140 | 4 |
| 25 | Crete-Vamos | 121 | 122 | 4 |
| 26 | Crete-Rethymno| 123 | 124 | 4 |
....
+-------+---------------+-----+-----+------+
TYPE
列は、場所のタイプ (3 - 国、4 - 都市) を格納するために使用されます。ご覧のように、Crete は city として格納されており、その子として他の都市 (Vamos
と など) が含まれています。Rethymno
次の 2 種類のクエリを実行する必要があります。
1) 特定の親の下にある特定のタイプのすべての場所を取得します。
2) 特定の親の下にある特定のタイプの上位のすべての場所を取得します: 提供された例では、ギリシャ国内の都市を照会する場合にのみ、場所の例を返す必要Crete Isl.
があります。Crete Isl.
Vamos
Rethymno
Crete Isl.
それぞれのケースで実行する最速のクエリは何ですか?
最初のケースでは、2 つのクエリを使用する (最初にギリシャの LFT と RGT を取得し、次に適切な LFT と RGT を持つタイプ = 4 のすべての場所を取得する) か、何らかの結合を使用して 1 つのステップですべての場所を取得することを検討します。 . 最適なアプローチはどれですか?
2番目のケースについては、現在適切なアイデアがありません。私は単純なサブセレクトを試しました:
select loc.* from LOC_TABLE loc
where 4 not in
(select TYPE from LOC_TABLE p
where p.lft < loc.lft AND p.rgt > loc.rgt)
AND loc.LFT > 100 AND loc.RGT < 200;
しかし、長すぎます。
これら 2 種類のクエリを高速化するのに役立つ列を追加して値を設定しても構いません。しかし、データをすばやく取得する必要があります。
ありがとう。