2014-09-08 80 views
5

Veritabanımdaki kayıtların konumunu depolamak için SQL Server coğrafya veri türü kullanıyorum. Bu oldukça hızlı bir şekilde çalışır benim test veritabanında düzine kayıtlarının bir çift ileCoğrafya ve mesafe kullanarak bir SQL Server veritabanından kayıtları seçin

DECLARE @location AS geography = geography::Point(@latitude, @longitude, 4326) 
DECLARE @distance AS INT = 10000 

SELECT * 
FROM records 
WHERE records.location.STDistance(@location) <= @distance 

ve ben herhangi bir sorun yok, ama bildiğim: ben belirli bir konum belirli bir mesafe içinde tüm kayıtları seçmek ister misiniz WHERE cümlesi veritabanımdaki tüm kayıtlara karşı STDistance çalıştırıyor ve bir kez binlerce kayıt yaptığımda, bir taramayı yavaşlatacak.

Bunu yapmanın daha iyi bir yolu var mı? Belki bir tür bölge yaratın ve komşu bölgelerde ilk önce veriyi seçin.

+3

Bununla birlikte ... ST_Distance fonksiyonunda kontrol edilir enlem/boylam değerleri aralığını daraltmak için sınırlama kutuları bir dizi yapabilirim, ben MIcrosoft yapmasına izin öneriyoruz. MSSQL uzaysal endeksleme için bir google yapın – Twelfth

+2

[Mekansal İndeksler Genel Bakış] (http://msdn.microsoft.com/en-us/library/bb895265.aspx) – wdosanjos

cevap

1

Kesinlikle @Twelfth öğesinin önerdiği gibi bir uzaysal dizin oluşturmak istiyorsunuz. Ayrıca, uzamsal endeksten daha iyi yararlanmak için aradığınız mesafeyi değil de aramanızı yapmak istiyorsunuz.

DECLARE @location AS geography = geography::Point(@latitude, @longitude, 4326) 
DECLARE @distance AS INT = 10000 
DECLARE @range AS geography = @location.STBuffer(@distance) 

SELECT * 
FROM records 
WHERE records.location.STIntersects(@Range) = 1 
İlgili konular