MSSQL Пространственный индекс, множественный предикат, не использующий индекс - PullRequest
0 голосов
/ 03 мая 2018

У меня есть таблица Location с пространственным индексом в столбце GeoLocation. Работает следующий запрос:

SELECT *
FROM Location WITH (INDEX (SpatialIndex_GeoLocation))
WHERE GeoLocation.STDistance(GEOGRAPHY::STGeomFromText('POINT(4.271942         
52.085289)', 4326)) < 50

Однако при добавлении второго предиката запроса:

SELECT *
FROM Location WITH (INDEX (SpatialIndex_GeoLocation))
WHERE GeoLocation.STDistance(GEOGRAPHY::STGeomFromText('POINT(4.271942         
52.085289)', 4326)) < 50
OR 
GeoLocation.STDistance(GEOGRAPHY::STGeomFromText('POINT(5.758871 52.7845827)', 4326)) < 50

Выдается следующее исключение:

Обработчику запросов не удалось создать план запроса для запроса с
подсказка пространственного индекса. Причина: не удалось найти требуемый предикат сравнения.
Попробуйте удалить индексные подсказки или удалить SET FORCEPLAN.

Конечно, удаление подсказки индекса заставит запрос работать, но без использования индекса.

Любая помощь будет принята с благодарностью

1 Ответ

0 голосов
/ 04 мая 2018

Обходной путь в этом случае может использовать операцию UNION, как показано ниже:

SELECT *
FROM Location WITH (INDEX (SpatialIndex_GeoLocation))
WHERE GeoLocation.STDistance(GEOGRAPHY::STGeomFromText('POINT(4.271942         
52.085289)', 4326)) < 50
UNION 
SELECT *
FROM Location WITH (INDEX (SpatialIndex_GeoLocation))
WHERE
GeoLocation.STDistance(GEOGRAPHY::STGeomFromText('POINT(5.758871 52.7845827)', 4326)) < 50
...