2016-07-14 4 views
2

私はテーブルを持っている地理的なタイプのポイントのポイントを持つポイント。私が最も近い点を得るために、このコードを実行しています:最も近いポイントを選択するSQL Serverの空間

CREATE SPATIAL INDEX SpatialIndex ON Points (Point); 

残念ながら、クエリはかなり遅いです:

DECLARE @Wgs84Longitude FLOAT; 
DECLARE @Wgs84Latitude FLOAT; 

DECLARE @Point GEOGRAPHY = Geography::STPointFromText(N'POINT(' 
              + CAST(@Wgs84Longitude AS NVARCHAR(MAX)) 
              + N' ' 
              + CAST(@Wgs84Latitude AS NVARCHAR(MAX)) 
              + N')', 4326); 

SELECT 
    TOP 1 
    * 
FROM Points 
ORDER BY @Point.STDistance(Point) ASC; 

ポイントテーブルには、このインデックスを持っています。より速く(インデックスおよび/またはクエリを賢明にする)ために改善できるものはありますか?

PS:

また、私はこのいくつかの味でプレイ:

CREATE SPATIAL INDEX SpatialIndex ON [Core].[InternationalPostcodeList](Point) 
USING GEOGRAPHY_GRID 
WITH 
(
--BOUNDING_BOX =(-8.164229, 49.18581, 8.05384, 60.717093) 
     GRIDS=(LEVEL_1 = HIGH,LEVEL_2 = HIGH,LEVEL_3 = HIGH,LEVEL_4 = HIGH) 
    , CELLS_PER_OBJECT = 64 
    , PAD_INDEX = OFF 
    , SORT_IN_TEMPDB = OFF 
    , DROP_EXISTING = OFF 
    , ALLOW_ROW_LOCKS = ON 
    , ALLOW_PAGE_LOCKS = ON 
) ON [PRIMARY]; 

パフォーマンスはまだ受け入れられません。

答えて

0

MSDNのマイクロソフト自身の記事は、「最近隣」クエリが空間インデックスを使用していることを確認するためのいくつかの改善点を示しています。主なものは、WHERE句にSTDistanceを使用して距離を制限することができないことです(それ以外の方法ではフィルタリングできません)。

これを適用して、パフォーマンスが向上するかどうかを確認してください。それ以外のヒントについては記事自体を参照してください。

MSDN Nearest Neighbor

EDIT

まず、あなたは次のようにクエリのポイントを作成するプロセスを簡素化することができます。第二に

DECLARE @Point GEOGRAPHY = GEOGRAPHY::Point(@latitude, @longitude, @srid); 

、おそらく違いを作ることはないだろうしかし、あなたは最大16セル(あなたが1つに行くことができる)でHHHHとして空間的なインデックスを宣言することができます。 1日の終わりには、インデックスの最下位レベルのレコードは1つだけですが、列に空間データ型を混在させるかどうかによって異なります。

第3に、私はいくつかのテストを実行しました。結果のために1秒未満で簡単に取得できるはずです。私は次のクエリを使用しました:

SELECT TOP 1 
* 
FROM 
Points P 
WHERE P.Point.STDistance(@Point) < (50 * 1609.344) -- 50 miles 
ORDER BY P.Point.STDistance(@Point) 

私の結果は1秒よりかなり速かったです。 WHERE句を省略した場合、時間は約1500%遅くなりました(データセットのサイズに応じて増減します)。しかし、これはまだ10-12秒の結果よりもずっと速かったです。

空間インデックスが機能していることを確認できますか?そうでない場合は、WITH(INDEX(SpatialIndex))ヒントを使用してみてください。それでも問題が解決しない場合は、クエリの実行計画をアップロードできますか?

+0

ありがとうございました。この記事で提案されているようにWHERE句を導入すると、明らかに空間インデックスの使用を強制するために、クエリはさらに遅く実行されます。 – cs0815

+0

@csetzkornテーブルのサイズ(行数)は何ですか?また、現在あなたは何を得ていますか? –

+0

約250万行... – cs0815

関連する問題