1

StContains関数を使用して2つの地理的な列を比較したいが、クエリの速度が遅くなり、30-40秒後に出力が得られる。私は、クエリの下に使用していますSTContainsを使用して地理的な列を比較すると、SQL Serverのクエリが遅くなる

SELECT DISTINCT 
      T.[LocationID], G.[Boundary].STContains(ESP.GeographyValue) 
    FROM [#TempTable] T 
    CROSS JOIN [dbo].[GeographyTable] G 
    INNER JOIN [dbo].LocationTable ESP ON T.LocationID = ESP.LocationID 
    WHERE G.[ID] = 1 

ここ境界の両方をGeographyValueは地理データ型です。

G. [境界] .STコンテナ(ESP.GeographyValue)を削除した場合、クエリは0秒後に実行されるため、パフォーマンスの主な問題はStContainsによるものです。

結果セットには、7000レコードが含まれている可能性があります。

更新:

私は列の両方に空間インデックスを追加したが、まだ実行が遅いです。私もSTContainsを試してみました

select ES.* from LocationTable ES INNER JOIN GeographyTable G ON ES.GeographyValue.STEquals(G.Boundary) = 1 Where G.Id = 1 

まだ運:単純なクエリを実行することにより、10クエリの下に使用secs.Iをとります。

+1

あなたが7000点の異なる場所を比較する必要があり、このクエリの目的は何であるの見直し?空間比較は複雑でリソース集中的なので、しばらく時間がかかりますが、7000件を実行しています。 Geographyの列に空間インデックスがありますか? – iamdave

+0

私は、ユーザーがその中から1つを選択できるUI上の地理のリストを持っており、GeographyTableと一致する場所を比較したいと思います。 LocationTableは別のデータベースに存在するので、GeographyTable IDカラムを追加することはできません。空間インデックスは両方のテーブルに存在しません。どのテーブルに追加する必要がありますか? –

+0

空間的なインデックスが空間的な列に表示されます...ユーザーがUIを使用して* 1つの地理を選択している場合、なぜ7000をすべて比較していますか?彼らが選んだものと比較するだけです。 – iamdave

答えて

2

フォースあなたのコードは、次のようになります

SELECT DISTINCT 
      T.[LocationID], G.[Boundary].STContains(ESP.GeographyValue) 
    FROM [#TempTable] T 
    CROSS JOIN [dbo].[GeographyTable] G WITH (INDEX(SI_Geofence_Boundary)) 
    INNER JOIN [dbo].LocationTable ESP ON T.LocationID = ESP.LocationID 
    WHERE G.[ID] = 1 

それは2-3秒に30-40秒から実行時間を短縮するコードの下に [dbo].[GeographyTable] G WITH (INDEX(SI_Geofence_Boundary))

あなたの改訂クエリを使用して空間インデックスを使用します。詳細については

link

関連する問題