Нужна помощь в оптимизации потенциально ошибочного пространственного запроса SQL

Я новичок в SQL, и мне нужна помощь для оптимизации пространственного запроса, чтобы он выполнялся менее чем за 2 секунды. Мы уже попробовали некоторые предложения, найденные на разных сайтах (подробнее об этом ниже).

Фон

У нас есть таблица [Id, Geometry], содержащая около 300000 геометрических фигур различных размеров и сложности, которые хранятся в виде геометрических типов данных. Мы создали пространственный индекс для геометрии, используя фрагмент кода ниже.

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 секунд.

Это план выполнения запроса: введите описание изображения здесь

Мы видим, что достигли пространственного индекса, но самая дорогая операция - это clustered index seek (Clustered)

Кластерный индекс ищет детали:

введите описание изображения здесь

Пространственный индекс искать детали:

введите описание изображения здесь

Вопросы

Разве тяжелая работа не должна выполняться пространственным индексом, а не кластерным индексом?

Можно ли улучшить запрос, изменив настройки пространственного индекса? Какие настройки мы должны использовать (для GRIDS, CELLS_PER_OBJECT и т. Д.)?

Как можно сократить время выполнения в целом или на 7-10 секунд то, что вы можете ожидать для этого вида запроса?

Что мы пробовали, это помогло

Каждый из них сэкономил примерно несколько секунд.

  • Проверено на фрагментацию индекса и перестроены индексы.
  • Переключен метод пересечения с STIntersect() в Filter()
  • Уменьшена входная геометрия с Reduce(.25), Это уменьшает геометрию с 1442 точек данных до 7. (Если мы решим использовать это, оно должно быть динамическим для разных входных данных, но это другая проблема.)
  • Введен новый столбец таблицы SimpleGeometry который содержит ограничивающие рамки всех геометрических объектов из Geometry колонка. Создан новый SimpleGeometry пространственный индекс и используется SimpleGeometry для поиска вместо Geometry, (Не используется в примере запроса.)

0 ответов

Что если вы выполняете вычисления каждый раз, когда добавляете новую фигуру, а затем сохраняете только пересечения в таблице? Теперь ваш запрос мгновенный.

Другие вопросы по тегам