2012-03-05 10 views
1

私は、半径15マイル以内のテーブル内のすべての場所を取得するクエリを実行しています。クエリには最大15秒かかります。SQL Server、LatおよびLonクエリ

SELECT * 
FROM rmiukpostcodes 
WHERE 3963.191 * ACOS((SIN(PI()*50.8320711166062/180)*SIN(PI()*latitude/180))+(COS(PI()*50.8320711166062/180)*cos(PI()*latitude/180)*COS(PI()*longitude/180-PI()*-0.207548227491786/180))) < = 5 

スピードアップのためにできることはありますか?

+2

どのバージョンのSQL Serverですか? –

+1

SQL Server 2008を使用している場合、ネイティブlat/lonサポートがあり、より高速になる可能性があります。 "SPATIAL DATA SUPPORT"を検索http://msdn.microsoft.com/en-us/magazine/dd434647.aspx –

+0

緯度と経度の列のインデックス? –

答えて

1

ここでは、計算された永続列を使用することでメリットが得られます。私はあなたのWHERE句のためにテーブル/インデックススキャンを引き起こしていると私は信じています。

実行計画をキャプチャします。計算列を追加し、SELECTクエリを変更してください。

+0

ですが、where句は毎回変更されます - 計算できるものは何もありません。 –

+0

@MattFellows演算子は確実に方程式の 'latitude'と' longitude'部分を計算カラムにグループ化します –

+0

私はSIN(PI()* latitude/180)とcos(PI()* latitude/180) - それ以外はすべてが義務と義務の機能です。 –

0

クエリはテーブル内のすべての行を読み取ります。フィルタの基準とインデックスをSARGABLEで指定してください。

たとえば、クエリを実行する前に、max/min latまたはlongを事前に計算して使用します。

WHERE 
    codes.Lat BETWEEN @minLat AND @maxLat 
    AND YourDistanceCalcHere(codes.Lat, codes.Long) 

次に、コード(LAT)のインデックスは、クエリ

+0

これはまったく役に立たない - 基本的に彼はどのように尋ねたのかを彼に言いました。 OPは彼がそれを速くするために何ができるか尋ねました、私は彼がより多くのクエリをフィルタリングすることを知っていると思いますが、彼はどのように彼のクエリに基づいて行うことができます - すなわち緯度と経度のnマイル以内のすべての行を見つける。 –

+0

@MattFellowsもし彼がsargable基準を知っていると思えば、私の答えは役に立たない。私は証拠(質問)によって指示された反対を仮定する。 –

+0

あなたはポイントを見逃しています - 唯一の基準が距離であるならば、それを制限する方法はありません。何も知識がないという証拠はありません。 –

関連する問題