2009-08-28 44 views
7

Mam obecnie witrynę z tabelą, która ma kolumny pływające długie/długie i indeks nad tymi dwiema kolumnami oraz inną, którą muszę pobrać.Czy mogę utworzyć indeks "Covering, Spatial" w SQL Server 2008?

Ciągle wyszukuję tę tabelę, aby uzyskać wiersze mieszczące się w promieniu od pewnego punktu (w rzeczywistości otrzymuję kwadrat dla prędkości), ale potrzebuję tylko pól, które są już indeksowane, więc ten indeks jest w rzeczywistości pokryciem, a plan wykonanie ma tylko 2 etapy:

Index Seek (cost: 100%) and SELECT (cost: 0%) 

teraz próbuję skorzystać z funkcji przestrzennych SQL 2008. i utworzeniu kolumny geografia, wypełnić go, utworzony indeks przestrzenny, dzieła.

Wszystko działa dobrze, z tym że plan wykonania ma milion kroków, a 74% czasu spędza na indeksie indeksów klastrowych, gdzie łączy wiersze znalezione w indeksie przestrzennym z rzeczywistym tabelą, aby uzyskać resztę danych ...
(Indeks przestrzenny Szukajcie trwa 1% kosztów planu wykonania)

Więc, jak widać, to przy użyciu indeks przestrzenny i znalezienie odpowiednio zapisy muszę dużo szybciej niż wcześniej z moim "regularnym" indeksem ponad Lat/Long, ale dołączenie do głównego stołu to KILLING me, zapytanie przestrzenne zajmuje 7 razy więcej czasu niż moje stare.

Czy istnieje sposób na dodanie więcej kolumn do indeksu przestrzennego, tak aby obejmował i może robić rzeczy w jednym kroku, tak jak robił to wcześniej?
Czy są inne rzeczy, które mogę zrobić, aby poprawić tę sytuację?


UPDATE: Znalazłem, że „regularne” indeksy „obejmują” innych kolumn za pomocą słowa kluczowego include (który ja nie wiedziałem o, kiedyś po prostu zawierać kolumny w samej index)
według do dokumentacji here, ta klauzula nie jest opcją dla Spatial Indexes ... Jakieś pomysły?

Dzięki!
Daniel

Odpowiedz

4

Nie, niestety nie ma obecnie możliwości utworzenia przestrzennego wskaźnika pokrycia - zapytanie zawsze wykona wyszukiwanie zakładki do tabeli podstawowej w celu uzyskania wartości geograficznej dla wiersza.

Dla STIntersects jest to oczywiście zawsze wymagane, ponieważ nadal musimy wykonać filtr pomocniczy na rzeczywistym obiekcie geograficznym, aby sprawdzić, czy rzeczywiście przecina obiekt parametru. Jednakże, jeśli nie potrzebujesz dokładnych odpowiedzi i możesz użyć funkcji Filtruj(), wówczas możliwe byłoby podanie kolumn klucza podstawowego z indeksu bez wykonywania wyszukiwania do tabeli podstawowej. Wspieranie tego jest czymś, co rozważamy w następnym wydaniu.

Jeśli chodzi o przyspieszenie bieżącego zapytania, czy próbowałeś używać funkcji Filter() i dostrajania indeksu za pomocą danych wyjściowych sp_help_geography_index?