地理データ型として格納されているいくつかのエリア (ポリゴン) を含むテーブル (Table2) があります。テーブルには 1529 行が含まれます。別のテーブル (Table1) には、約があります。22000 行。それぞれに X/Y があり、そこからポイントを作成し、Geography 列に格納します。
各ポイントがどの領域に属しているかを調べるために、空間結合を行う必要があります。両方のテーブルに空間インデックスを作成しましたが、クエリが遅すぎると思います。現在、次のような結合を行うのに約 72 秒かかります。
SELECT ...
FROM [DatabaseA].dbo.Table1 t1
INNER JOIN [DatabaseB].dbo.Table2 t2 ON t1.Geo.STIntersects(t2.Geo) = 1
WHERE t2.ObjectTypeId = 1 AND t2.CompanyId = 3
2 つのテーブルは異なるデータベースにありますが、同じサーバー上にあることに注意してください。
空間インデックスを作成する前は、クエリが非常に遅く、インデックスが使用されていることがわかります。ただし、table2 にインデックスを作成してもパフォーマンスには影響しません。table1 にインデックスを作成するだけでパフォーマンスが向上します。両方のインデックスに高レベルのグリッドがあります
実行計画を見ると、71% の時間を費やしている Filter 部分に気付きました。
CASE WHEN [Expr1015]>(2) THEN CASE WHEN [Expr1016]=[Expr1017] THEN (1) ELSE (0) END ELSE [DatabaseA].[dbo].[Table1].[Geo] as [t].[Geo].STIntersects([DatabaseB].[dbo].[Table2].[Geo] as [g].[Geo]) END=(1)
だから、私の質問は:
このクエリにそれほど時間がかかる必要がありますか? 他のグリッド サイズを使用する必要がありますか? そのフィルター式は何を意味するのでしょうか?
これを最適化するためのヒントはありますか?