重心を内部に収まるポリゴンと一致させようとする大規模なクエリがあります。ブロックとポリゴンのZ値で制約しますが、それでも多くのポイントインポリ計算を実行し、実行に長い時間がかかります。
いくつかの背景について:
- 図心を含むテーブルには250万行あります
- 表のすべての空間データは世界の非常に小さな領域にあり、全体の境界ボックスはわずか7643x2351メートルです。
- それらの行のうち、660KフィットはZ基準に一致します
- ポリゴンを含むテーブルには10K行があります
- 表のすべての空間データは、世界のさらに小さな領域にあります
- それらの行のうち、2366は名前の基準に一致します
- インデックスなしでクエリを実行すると11時間かかり、91Kの一致が返されます
クエリは次のようなものです。
select blocks.Id, blocks.WGS84Centroid, polygons.Shape
from
blocks inner join polygons
on
blocks.ZCentre >= (polygons.ZCentre - (polygons.ZLength/2)) and blocks.ZCentre <= (polygons.ZCentre + (polygons.ZLength/2)) and
polygons.Shape.STIntersects(blocks.WGS84Centroid) = 1
inner join name
on
polygons.nameId = name.ID
where name.Name = 'blah'
したがって、このクエリを高速化するために、に空間インデックスを追加しblocks.WGS84Centroid
、に1つ追加しましたpolygons.Shape
。
クエリアナライザは、blocks.Idとblocks.WGS84Centroidを含むblocks.ZCentreの非クラスタ化インデックスも提案しました。
その後、クエリプランは次のようになります。
そしてフィルターコスト:
ただし、これら3つのインデックスを追加した後でも、クエリの実行には同じくらいの時間がかかります。
私は今何ができますか?