2016-02-07 7 views
5

Mam aplikację, która wyszukuje elementy na podstawie kodu pocztowego.Wyszukiwanie produktu pocztą/kod pocztowy | Algorytm Haversine'a Wydajność

Po wyszukaniu kodu pocztowego, zwracam wszystkie produkty z tego miasta/okolic (zrobione przez przeanalizowanie kodów pocztowych/zip).

Muszę teraz sortować te produkty na podstawie odległości od oryginalnego kodu pocztowego/pocztowego.

Mam długość/długość przechowywana w DB i planuję użyć formuły Haversine do obliczenia odległości apprx od pierwotnego zapytania.

Moje pytanie brzmi, gdzie należy to obliczyć. Czy powinienem to zrobić w procedurze przechowywanej przed zwróceniem zestawu danych?

Czy powinienem zwrócić mój zestaw danych, z moim Lat/Long, i obliczyć stronę serwera przed powrotem do użytkownika.

Może być konieczne obliczenie do 1000 wyników.

+0

Jakie są Twoje DBMS? – jdphenix

+0

Sql Server MS. – Mark

+1

Jestem daleko od eksperta w tym temacie (pracowałem z zapytaniami przestrzennymi przy użyciu PostGIS i vincenty), ale prawdopodobnie bazą danych, ponieważ możesz mieć przestrzenne indeksy na danych lat/lon i porządku przez 'STDistance()' i musisz sortować według odległości. Wszystko poza bazą danych może być w porządku, ale wymyśliłbyś na nowo koło. – jdphenix

Odpowiedz

3

Zazwyczaj serwery DB są związane z IO, a nie z CPU. YMMV, ale jeśli twoja sprawa jest typowa, byłoby pożądane wykonanie obliczeń Haversine na serwerze DB.

polecam przy użyciu niestandardowego tabeli odnośników do sinus obliczeń, jak można prawdopodobnie dostarczyć przybliżone odległości na skali logarytmicznej, takie jak:

  • 100m,
  • 300m,
  • 1 km ,
  • 3 km,
  • 10 km, 30 km
  • ,
  • > 30 km

    a następnie za pomocą interpolacji liniowej jako udoskonalenia.

Dla typowych odległościach napotkanych z jednego obszaru metropolitalnego, można rozważyć zastosowanie tylko 2 lub 3 warunki the Taylor expansion for sin and cos zamiast dokładniejszych obliczeń:

  • sin (x) = ~ x - x^3/6 + x^5/120
  • cos (x) = ~ 1 - x^2/2 + x^4/24

Przypomnijmy, że w zbieżnym Taylor Series, z błędu po nth termin jest ściśle niższy niż wielkość (n + 1) "pierwszego terminu. Pozwala to na skuteczne zakończenie obliczeń po osiągnięciu pożądanej dokładności, która ogólnie dla formuły Haversine wynosi tylko 0,5%, ponieważ Ziemia nie jest jednolitą kulą.

1

Czy używasz wersji SQL Server 2008 lub nowszej? Jeśli tak, zalecam korzystanie z wbudowanego typu danych geograficznych zamiast bezpośredniego obliczania Haversine. Możesz mieć tabelę kodów pocztowych z kodem pocztowym (np. 90210) i centralnym punktem kodu pocztowego lub całym obszarem objętym kodem pocztowym w innej kolumnie (lub obu, jeśli ma to sens w przypadku Twojej aplikacji).Następnie możesz użyć funkcji STDistance(), aby obliczyć odległość. Ponadto dzięki indeksowaniu przestrzennemu można uzyskać listę uporządkowaną według odległości bez nadmiernego wysiłku.