0

米国内のすべての郵便番号を含むテーブルがあり、クエリで郵便番号の境界座標と各郵便番号の離れた数を選択しています。特定の郵便番号を指定すると、この操作はかなり高速になります。問題は、IN 演算子を追加して、特定の半径内のすべての郵便番号を取得できるようにすることです。これを行うには、ここに示されている大円関数http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=81360を使用しました。私が今思う問題は、大円関数から返されるすべての郵便番号に対して操作全体が実行されていることです。最終結果はGoogleマップ用ですが、SQLクエリの改善には関係ありません。パフォーマンスを改善するには、このクエリをどのように変更する必要がありますか? 私はすでに郵便番号のインデックスを作成しています。どんな助けでも大歓迎です!

select s.ZipCode, count(a.[Apartment_Complex]) apartCount, b.Longitude, b.Latitude from ZipCodeServiceAvailability s  
                left join pdx_apart_view a on s.ZipCode = left([Zip Code], 5)  
                left join ZipCodeBoundaries b on s.ZipCode = b.ZipCode 
                Where Ordering % 10 = 0 and s.zipcode in 
                                      (Select zipcode from ZipCodeServiceAvailability 
                                       Where AzumaWebInput.dbo.F_GREAT_CIRCLE_DISTANCE
                                             ((Select Latitude from ZipCodeServiceAvailability where ZipCode = '78745'), --latitude
                                              (Select Longitude from ZipCodeServiceAvailability where ZipCode = '78745'), --longitude
                                              Latitude,
                                              Longitude) <  200) -- get all zips within 200 miles of 78745
                Group By s.ZipCode, IsServiced, b.Longitude, b.Latitude, b.Ordering  
                Order by s.ZipCode, b.Ordering
4

2 に答える 2

3

はい、テーブル内のすべてのレコードで大圏距離を計算しています。

より高速なクエリは、2 つの緯度と 2 つの経度の間の四角形ですべての郵便番号を取得することです。

緯度と経度の両方のフィールドを持つ ZipCodeServiceAvailability テーブルにインデックスがあることを確認してください。

編集:

交換

(Select zipcode from ZipCodeServiceAvailability 
                                   Where AzumaWebInput.dbo.F_GREAT_CIRCLE_DISTANCE
                                         ((Select Latitude from ZipCodeServiceAvailability where ZipCode = '78745'), --latitude
                                          (Select Longitude from ZipCodeServiceAvailability where ZipCode = '78745'), --longitude
                                          Latitude,
                                          Longitude) <  200) 

(Select zipcode from ZipCodeServiceAvailability
 Where Latitude between @Latitude - 100 and @Latitude + 100
   and Longitude between @Longitude - 100 and @Longitude + 100)
于 2013-02-28T17:13:31.633 に答える
1

私はあなたが正しいと思います。しかし、なぜサブクエリを使用しているのですか? サブクエリは、「元のテーブルの郵便番号は、別の場所から 200 (マイル?) 以内にある郵便番号のリストにありますか?」と言っています。

これは、「この郵便番号はその場所から 200 (マイル) 以内にありますか?」と尋ねるのと同じです。

そして、あなたはそれを次のように言います:

select s.ZipCode, count(a.[Apartment_Complex]) apartCount, b.Longitude, b.Latitude
from ZipCodeServiceAvailability s left join
     pdx_apart_view a
     on s.ZipCode = left([Zip Code], 5) left join
     ZipCodeBoundaries b
     on s.ZipCode = b.ZipCode 
Where Ordering % 10 = 0 and
      AzumaWebInput.dbo.F_GREAT_CIRCLE_DISTANCE((Select Latitude from ZipCodeServiceAvailability where ZipCode = '78745'), --latitude
                                                (Select Longitude from ZipCodeServiceAvailability where ZipCode = '78745'), --longitude
                                                Latitude,
                                                Longitude
                                               ) <  200)
Group By s.ZipCode, IsServiced, b.Longitude, b.Latitude, b.Ordering  
Order by s.ZipCode, b.Ordering
于 2013-02-28T18:26:19.987 に答える