Обновление : Со времени написания этого поста мы решили перенести наши геопространственные данные в базу данных ElasticSearch, что дало лучшие результаты.
Я новичок в SQL и мне нужна помощь для оптимизациипространственный запрос, чтобы он выполнялся менее чем за 2 секунды.Мы уже попробовали некоторые предложения, найденные на разных сайтах (Подробнее об этом ниже).
Фон
У нас есть таблица [Id, Geometry], содержащая около 300 000 геометрических фигур различных размеров и сложности,хранятся как типы данных геометрии.Мы создали пространственный индекс для Geometry, используя фрагмент кода ниже.
CREATE SPATIAL INDEX [IX_Geometry_Spatial]
ON [dbo].[Geometries] ([Geometry]) USING GEOMETRY_AUTO_GRID
WITH (
BOUNDING_BOX = (XMAX = 24.43359375, XMIN = 10.810546875, YMAX = 69.2249968541159, YMIN = 55.2791152920156)
);
Нам нужно найти все геометрические фигуры, которые пересекаются с входной геометрической формой.Это делается с помощью следующего запроса.
DECLARE @g geometry;
SET @g = geometry::STGeomFromText('POLYGON ((x0 y0, ...))', 4326); -- A Worst Case Polygon containing 1442 data points
SELECT Count(Id)
FROM Geometries
WHERE Geometries.Geometry.Filter(@g.Reduce(.25)) = 1
Для некоторых входных геометрических фигур наихудшего случая (большие, сложные многоугольники) это выполнение занимает около 7-10 секунд.
Это выполнениеплан для запроса: ![enter image description here](https://i.stack.imgur.com/kchPI.png)
Мы видим, что мы попали в пространственный индекс, но самая дорогая операция - это clustered index seek (Clustered)
Сведения о кластеризованном индексе.:
![enter image description here](https://i.stack.imgur.com/0T8Ln.png)
Информация о пространственном указателе поиска:
![enter image description here](https://i.stack.imgur.com/9hM8B.png)
Вопросы
Разве тяжелая работа не должна выполняться пространственным индексом, а не кластерным индексом?
Можно ли улучшить запрос, изменив настройки пространственного индекса?Какие настройки мы должны использовать (для GRIDS, CELLS_PER_OBJECT и т. Д.)?
Как общее время выполнения может быть сокращено в целом или на 7-10 секунд то, что вы можете ожидать для этого вида запроса?
То, что мы пробовали, помогло
Каждый из них сэкономил примерно несколько секунд.
- Проверен на фрагментацию индекса и перестроен индексы.
- Переключен пересечениеМетод с
STIntersect()
до Filter()
- Уменьшена входная геометрия с
Reduce(.25)
.Это уменьшает геометрию с 1442 точек данных до 7. (Если мы решим использовать это, оно должно быть динамическим для разных входных данных, но это другая проблема.) - Введен новый столбец таблицы
SimpleGeometry
, которыйсодержит ограничивающие рамки всех геометрических объектов из столбца Geometry
.Создал новый SimpleGeometry
пространственный индекс и использовал SimpleGeometry
для поиска вместо Geometry
.(Не используется в примере запроса.)