2012-06-18 40 views
5

używam przestrzennej indeksu i gdy próbuję wykonać WHERE oświadczenie:Błąd podczas korzystania przestrzennej indeksu w SQL Server

WHERE T.GEOMETRY.STIntersects(O.GEOMETRY) = 1 AND T.GEOMETRY.STTouches(O.GEOMETRY) = 0 

To działa dobrze, ale gdy próbuję wykonać z OR:

WHERE T.GEOMETRY.STOverlaps(O.GEOMETRY) = 1 OR T.GEOMETRY.STWithin(O.GEOMETRY) = 1 

otrzymuję ten błąd:

The query processor could not produce a query plan for a query with a spatial index hint. Reason: Could not find required binary spatial method in a condition. Try removing the index hints or removing SET FORCEPLAN.

Każda pomoc, co jest problemem w tym stwierdzeniem?

+0

Tak więc komunikat o błędzie nawiązuje do wskazówki indeksu przestrzennego. Czy próbujesz wymusić rękę optymalizatora, wykonując coś w stylu "z tbl z (index (idx_spatial))"? –

+0

Tak, używam "FROM Table WITH (INDEX (spatial_index))". Nie rozumiem tego błędu, dlaczego działa on z AND, ale nie z OR. – Nenad

+2

Nie wiem, ale serwer jest wyraźnie zły na twoje próby obejścia tego, co normalnie by zrobił. Zrzuć podpowiedź indeksu: zwykle są zarezerwowane, gdy naprawdę wiesz, co robisz (nie mówiąc, że jesteś nowicjuszem, ale rzadko zdarza się, aby ktokolwiek był mądrzejszy od optymalizatora). –

Odpowiedz

1

Ogólne rozwiązanie problemów z zapytaniami typu OR (zazwyczaj wydajność) polega na ich rozdzieleniu i wykorzystaniu opcji UNION ALL pomiędzy nimi. Zwykle odbywa się to w pod-zapytaniu lub wspólnym wyrażeniu tabelowym.

Jeśli możesz opublikować więcej swojego zapytania, a najlepiej odpowiedni schemat tabeli, to mogę zaktualizować swoją odpowiedź bardziej szczegółową odpowiedzią.