#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
.k4. @GordonLinoff — используется ли # для обозначения таблицы сеансов в чем-либо, кроме MSSQL?
5. Почему вы используете временную таблицу вместо готовой. Поскольку вы создаете индекс, он все равно должен быть на диске — я бы сказал, создайте таблицу на диске и настройте индекс перед этим запросом — также, что говорит план запроса — дает ли это подсказки?