Нужна помощь в оптимизации потенциально ошибочного пространственного запроса 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 ответов
Что если вы выполняете вычисления каждый раз, когда добавляете новую фигуру, а затем сохраняете только пересечения в таблице? Теперь ваш запрос мгновенный.