Как повысить производительность моего запроса на обновление географии в SQL Server 2008 с помощью STDistance? - PullRequest
2 голосов
/ 18 ноября 2011

У меня серьезные проблемы с производительностью при запросе пространственного обновления в SQL Server 2008 (не R2) с использованием STDistance (). Цель достаточно проста: у меня есть таблица с 120 000 записей, Дома с колонкой Ближайшая библиотека . У меня есть вторая таблица с 12 записями, Библиотеки со столбцом Имя . Обе таблицы имеют столбец географии LatLngGeography . Я хочу обновить Houses.NearestLibrary с именем ближайшей библиотеки из Библиотеки .

Выполнение этого запроса занимает около 50 секунд:

UPDATE Houses
    SET NearestLibrary = (
    SELECT TOP 1 Name
    FROM Libraries
    ORDER BY Houses.LatLngGeography.STDistance(Libraries.LatLngGeography)
)

Это было бы почти приемлемо, за исключением того, что когда я запускаю его для парков, а не для библиотек, где у меня около 100 парков, это занимает почти в 10 раз больше времени. Обе таблицы имеют правильно построенные пространственные индексы с именами IX_Houses_LatLngGeography и IX_Libraries_LatLngGeography соответственно, но до сих пор я не смог понять, как заставить их использовать их запрос.

Есть ли способ повысить производительность моего запроса?

Ответы [ 2 ]

1 голос
/ 18 ноября 2011

Используйте «подсказку».

UPDATE Houses     
SET NearestLibrary = (     
    SELECT TOP 1 Name     
    FROM Libraries WITH(INDEX( SPATIAL_INDEX_NAME_HERE ))
    ORDER BY Houses.LatLngGeography.STDistance(Libraries.LatLngGeography) 
) 
0 голосов
/ 18 ноября 2011

Ну, я немного сократил время выполнения, используя временную таблицу. Вот мой конечный результат запроса:

IF OBJECT_ID('tempdb..#TempDistances') IS NOT NULL DROP TABLE #TempDistances
CREATE TABLE #TempDistances (
    HouseID varchar(20),
    Distance float
)

INSERT INTO #TempDistances
SELECT h.HouseID, MIN(h.LatLngGeography.STDistance(l.LatLngGeography)) AS Distance
FROM (SELECT * FROM Houses) AS h
LEFT JOIN Libraries AS l
ON h.LatLngGeography.STDistance(l.LatLngGeography) IS NOT NULL
GROUP BY h.HouseID

CREATE NONCLUSTERED INDEX TempDistances_HouseID ON #TempDistances (HouseID)
CREATE NONCLUSTERED INDEX TempDistances_Distance ON #TempDistances (Distance)

UPDATE h
SET NearestLibraryID = l.ID,
NearestLibraryName = l.Name,
NearestLibraryURL = l.URL,
NearestLibraryDistance = t.Distance
FROM (Houses AS h
   INNER JOIN #TempDistances AS t ON h.HouseID = t.LPINumber)
       INNER JOIN Libraries AS l ON h.LatLngGeography.STDistance(l.LatLngGeography) = t.Distance

DROP TABLE #TempDistances

Это все-таки не так быстро, как хотелось бы, но он работает в ближайших парках за 8 минут вместо 40, так что я намного счастливее, чем был. Спасибо @CatchingMonkey за помощь.

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