Множественный предикат пространственного индекса MSSQL, не использующий индекс

У меня есть таблица 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.

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

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


person David    schedule 03.05.2018    source источник


Ответы (1)


Обходной путь в этом случае может заключаться в использовании операции 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
person Alberto Morillo    schedule 03.05.2018
comment
Союз действительно работает. Индекс используется. Однако объединение типа данных geography не допускается. Это приводит к следующему: География типа данных не может использоваться в качестве операнда для операторов UNION, INTERSECT или EXCEPT, поскольку они несопоставимы. Также для моей конкретной ситуации есть около 4000 или предикатов, что приведет к 4000 союзам и большому количеству работы для меня, которая в данный момент того не стоит. Но спасибо за ваше предложение. - person David; 04.05.2018