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)
ありがとう