Как повысить производительность пространственных запросов SQL?

#sql #sql-server #spatial #spatial-index #sqlgeography

#sql #sql-server #пространственный #пространственный индекс #география sqlgeography

Вопрос:

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

Процедура извлекает данные GPS в реальном времени (около 200 строк) и пытается сопоставить каждую координату GPS с заранее определенными полигонами, которые хранятся в таблице sperate, чтобы присвоить каждой строке «Текущее местоположение».

В настоящее время процедура занимает в среднем около 13 секунд, однако среднее время составляет 7 секунд, а стандартное отклонение равно 14. Часто выполнение запроса может занять более минуты, что не идеально, поскольку эти данные предназначены для влияния на текущие операции.

Вот конкретный аспект кода, который вызывает проблему:

 CREATE SPATIAL INDEX spatial_lookup
ON #CurrentLoc(Area)
USING GEOGRAPHY_GRID
WITH (GRIDS = (LEVEL_1 = HIGH, LEVEL_2 = HIGH, LEVEL_3 = HIGH, LEVEL_4 = HIGH)
              ,CELLS_PER_OBJECT = 4
              ,PAD_INDEX = OFF
              ,STATISTICS_NORECOMPUTE = OFF
              ,SORT_IN_TEMPDB = OFF
              ,DROP_EXISTING = OFF
              ,ONLINE = OFF
              ,ALLOW_ROW_LOCKS = ON
              ,ALLOW_PAGE_LOCKS = ON)
              ON [PRIMARY]

CREATE SPATIAL INDEX point_lookup
ON #LatestGPSPoints(Point)
USING GEOGRAPHY_GRID
WITH (GRIDS = (LEVEL_1 = HIGH, LEVEL_2 = HIGH, LEVEL_3 = HIGH, LEVEL_4 = HIGH)
              ,CELLS_PER_OBJECT = 16
              ,PAD_INDEX = OFF  
              ,STATISTICS_NORECOMPUTE = OFF
              ,SORT_IN_TEMPDB = OFF
              ,DROP_EXISTING = OFF
              ,ONLINE = OFF
              ,ALLOW_ROW_LOCKS = ON
              ,ALLOW_PAGE_LOCKS = ON)             
              ON [PRIMARY]

UPDATE P 
SET P.CurrentLocation = (SELECT TOP 1 G.Blocks
                         FROM #CurrentLoc AS G WITH (INDEX(spatial_lookup))
                         WHERE G.Area.STDistance(P.Point) < 10
                         ORDER BY G.Area.STDistance(P.Point) ASC)
FROM #LatestGPSPoints P
 

Есть ли у вас какие-либо советы или идеи, как я могу сделать этот запрос более последовательным и быстрым?

Как я могу сделать этот запрос более быстрым и согласованным?

Спасибо

Комментарии:

1. Пометьте свой вопрос базой данных, которую вы используете.

2. Зачем мне нужно помечать базу данных, которую я использую?

3. . . SQL — это стандартизированный язык, полностью поддерживаемый ни одной из известных мне баз данных. Каждая база данных имеет свои особенности. Ваш код завершится ошибкой в большинстве баз данных при втором токене SPATIAL .k

4. @GordonLinoff — используется ли # для обозначения таблицы сеансов в чем-либо, кроме MSSQL?

5. Почему вы используете временную таблицу вместо готовой. Поскольку вы создаете индекс, он все равно должен быть на диске — я бы сказал, создайте таблицу на диске и настройте индекс перед этим запросом — также, что говорит план запроса — дает ли это подсказки?