Mam dużą bazę klientów, zaimplementowaną w serwerze sql 2005. Każdy klient ma szerokość i długość geograficzną, reprezentowaną jako Decimal(18,15)
. Najważniejszą wyszukiwane w bazie próbuje znaleźć wszystkich klientów bliskie pewnym miejscu tak:Jak dobry jest typ danych geograficznych w serwerze sql 2008?
(Addresses.Latitude - @SearchInLat) BETWEEN -1 * @LatitudeBound AND @LatitudeBound)
AND ((Addresses.Longitude - @SearchInLng) BETWEEN -1 * @LongitudeBound AND @LongitudeBound)
Tak, jest to bardzo prosta metoda. @LatitudeBound
i @LongitudeBound
to tylko liczby, które służą do wycofania wszystkich klientów w prostokącie otaczającym punktu @SearchInLat, @SearchInLng
. Po uzyskaniu wyników na komputerze-kliencie niektóre wyniki są odfiltrowywane, więc istnieje krąg ograniczający, a nie prostokąt. (Robi się to na komputerze klienckim, aby uniknąć obliczania pierwiastków kwadratowych na serwerze.)
Ta metoda działa dobrze w przeszłości. Teraz jednak chcemy sprawić, by wyszukiwanie stało się bardziej interesujące - na przykład zwiększenie liczby wyników może być bardziej przewidywalne lub aby użytkownik dynamicznie zwiększył rozmiar promienia wyszukiwania. Aby to zrobić, szukałem możliwości ugprading do serwera sql 2008, z jego Geograficznym typem danych, indeksami przestrzennymi i funkcjami odległościowymi. Moje pytanie brzmi: jak szybko są te?
Zaletą prostego zapytania, które mamy w danym momencie, jest to, że jest bardzo szybki i nie wymaga dużej wydajności, co jest bardzo ważne, ponieważ jest bardzo często nazywane. Jak szybko zapytanie oparte na czymś takim:
SearchInPoint.STDistance(Addresses.GeographicPoint) < @DistanceBound
Być przez porównanie? Czy indeksy przestrzenne działają dobrze i czy szybkość STD jest szybka?