0

3 つのテーブルがあるとします。

  • A. 自治体 (マルチポリゴン)
  • B. 郵便番号重心 (ポイント)
  • C. ユーザーデータ(ポイント)

(C) からのエントリは、(B) のエントリと FK (コード) で一致します。

次の効率的な方法を探しています。

ST_Containsを使用して、自治体 (A) 内のユーザー データ (C) の数をカウントします。

しかし

ここにキャッチがあります:

C のエントリが NULL の場合 (または別の条件に一致する場合) は、FK を使用して B に一致するエントリが存在する場合に使用します !!!

現在、私はさまざまなパターンを試しましたが、空間的に A & B と A & C を照会するのはどちらも 1 秒未満ですが、それらをすべて 1 つのクエリ (目標) に追加すると、結果は 4 秒を超えます

私が試したもののサンプル:

これはさらに悪いです (60 秒以上):

SELECT
    A.*,
    (SELECT FROM 
        (SELECT CASE WHEN C.GEOM IS NULL THEN B.GEOM ELSE C.GEOM END
         FROM C LEFT JOIN B ON C.ID=B.ID) AS b 
         WHERE ST_CONTAINS(A.GEOM, b.GEOM)
    ) count
FROM
    A

これは 15 秒です。

SELECT 
    A.ID, ..., -- other A fields
    COUNT(B.GEOM)
FROM
    A,
    (SELECT CASE WHEN C.GEOM IS NULL THEN B.GEOM ELSE C.GEOM END
     FROM C LEFT JOIN B ON C.ID=B.ID) AS b
WHERE
    ST_Contains(A.GEOM, b.GEOM)
GROUP BY
    A.ID, ... -- other A fields

私が言ったように

SELECT COUNT(*) FROM A LEFT JOIN B ON ST_Contains(A.GEOM, B.GEOM)

SELECT COUNT(*) FROM A LEFT JOIN C ON ST_Contains(A.GEOM, C.GEOM)

どちらも 1 秒以内に戻ります。

外部キーにもすべてのインデックスが配置されています (B.ID = C.ID)

ありがとう

4

1 に答える 1

0

A.geomと B.geom のインデックスを作成しましたか?

それはそのようになります

CREATE INDEX idx_A ON A USING GIST ( GEOM );
VACUUM ANALYZE A (GEOM);
CREATE INDEX idx_B ON B USING GIST ( GEOM );
VACUUM ANALYZE B (GEOM);
于 2012-06-04T22:28:47.620 に答える