2014-04-15 48 views
6

Posiadam ~ 400 000 punktów POI przechowywanych w GEOGRAPHY przestrzennych sql.SQL Optymalizowanie indeksu przestrzennego dla zlokalizowanych punktów geograficznych

będę zapytań te punkty z PointOfInterest.STDistance (@CentralPoint) < @Radius do znaleźć pointofinterest w określonym promieniu z @CentralPoint przesłanym zapytaniu.

Czytałem trochę o warstwach siatek i chciałbym, aby ktoś, kto zna ich rzeczy, polecił najbardziej sensowny wzór siatki. Domyślną wartością jest

level_1 = MEDIUM, level_2 = MEDIUM, level_3 = MEDIUM, LEVEL_4 = MEDIUM

Ale moja sytuacja jest taka, że ​​będę tylko ciekawostki ciągu theUK. Pomimo tego, że jesteśmy niesamowici, zajmujemy się tylko względną specyfikacją terra firma, więc zastanawiałem się, czy istnieje lepszy wzór siatki do użycia w indeksie przestrzennym dla tego przypadku.

Opierając się na geografii Nie mogę użyć uroczo wyglądających pól ograniczających geometrię. Korzystam również z SQL Azure, który nie wydaje się mieć przestrzennej pomocy przechowywanych proców: (

Odpowiedz

2

Jak zawsze z Spatial Indexing, w końcu odkrywasz, że testowanie różnych ustawień siatki na twoim zbiorze danych może przynieść różne wyniki do To znaczy, stwierdzam, że ustawienie Low na wszystkich poziomach, lub Medium, Low, Low, Low daje świetne wyniki z Punktami z powodu ich uproszczonego charakteru:

Aby jednak najlepiej wykorzystać indeks, należy rozważyć opcjonalne buforowanie wskaż i sprawdź skrzyżowanie Ponownie, okazało się, że często daje lepsze, konsekwentnie niskie czasy wyników, ale przetestuj je na swoich danych:

DECLARE @point GEOGRAPHY = GEOGRAPHY::STPointFromText('POINT(<coords>)', 4326); 
DECLARE @radius INT = 1000; 

SELECT 
* 
FROM <table> 
WHERE <GeographyColumn>.STIntersects(@point.STBuffer(@radius)) = 1; 

Staraj się trzymać z daleka od chęci przejścia na Geometry, ponieważ przynosi to nieco szybsze zapytania, ma większą szansę na uzyskanie "nieprawidłowych" wyników z powodu pracy z modelem planarnym. To powiedziawszy, jeśli odległości wyszukiwania są wystarczająco małe, różnica nie będzie widoczna w większości scenariuszy.

+0

Dzięki! Czy możesz krótko wyjaśnić zalety swojej sugestii sieci niskiego poziomu, ponieważ uważałbym, że bardziej precyzyjny "wysoki" brzmiał najlepiej podczas czytania o nich – BritishDeveloper

+0

@BritishDeveloper, No cóż, korzystanie z siatki niskiego poziomu utrzymuje indeks stosunkowo lekki i szybki - LLLL w jego obrębie znajduje się maksymalnie 65536 komórek poziomu 4. Testowanie kilku zestawów informacji (w porównaniu z danymi z Wielkiej Brytanii) ogólnie przyniosło wyniki lepsze lub równe wydajności niż w przypadku innych kombinacji (wypróbowałem je wszystkie). Jednak, gdy mamy do czynienia z wielokątami, potrzebny jest wyższy poziom, aby lepiej radzić sobie ze złożonością, a także eksperymentować z komórkami na wartość obiektu. Były przypadki, w których MLLL lub HLLL były lepsze, więc polecam ich wypróbować, ale z 400k rzędami mówimy o 10-stkach z górnych wierzchołków –