У меня есть большой запрос, который пытается сопоставить центроиды с полигонами, которые они помещают внутри. Хотя я ограничиваю значениями Z блоков и полигонов, он по-прежнему выполняет много вычислений точек в полигонах и занимает длительное время для выполнения.
Для некоторого фона:
- Таблица, содержащая центроиды, имеет 2,5 млн строк.
- Все пространственные данные в таблице относятся к довольно небольшой области мира, ограничивающая рамка всего этого составляет всего 7643 x 2351 метр.
- Из этих строк 660 тыс. соответствуют критерию Z.
- Таблица, содержащая полигоны, имеет 10 тыс. строк.
- Все пространственные данные в таблице относятся к еще меньшей области мира.
- Из этих строк 2366 соответствуют критериям имени.
- Выполнение запроса без каких-либо индексов занимает 11 часов и возвращает 91 тыс. совпадений.
Запрос примерно такой:
select blocks.Id, blocks.WGS84Centroid, polygons.Shape
from
blocks inner join polygons
on
blocks.ZCentre >= (polygons.ZCentre - (polygons.ZLength/2)) and blocks.ZCentre <= (polygons.ZCentre + (polygons.ZLength/2)) and
polygons.Shape.STIntersects(blocks.WGS84Centroid) = 1
inner join name
on
polygons.nameId = name.ID
where name.Name = 'blah'
Итак, чтобы ускорить этот запрос, я добавил пространственный индекс для blocks.WGS84Centroid
и один для polygons.Shape
.
Анализатор запросов также предложил некластеризованный индекс для блоков.ZCentre, включая блоки.Id и блоки.WGS84Centroid. .
После всего этого вот план запроса:
И стоимость фильтра:
Однако после добавления этих трех индексов выполнение запроса по-прежнему занимает столько же времени.
Что мне теперь делать?