Нужна помощь в оптимизации потенциально ошибочного пространственного запроса SQL - PullRequest
0 голосов
/ 28 ноября 2018

Обновление : Со времени написания этого поста мы решили перенести наши геопространственные данные в базу данных 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

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

Сведения о кластеризованном индексе.:

enter image description here

Информация о пространственном указателе поиска:

enter image description here

Вопросы

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

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

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

То, что мы пробовали, помогло

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

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

1 Ответ

0 голосов
/ 18 мая 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...