我使用STDistance()在SQL Server 2008(而不是R2)中使用空间更新查询时出现严重的性能问题。目标很简单:我有一个包含120,000条记录的表格,住宅,其中列为最近的图书馆。我有第二个包含12条记录的表,库,列名称。两个表都有一个地理列 LatLngGeography 。我想用图书馆中最近的图书馆名称更新 Houses.NearestLibrary 。
此查询大约需要50秒才能运行:
UPDATE Houses
SET NearestLibrary = (
SELECT TOP 1 Name
FROM Libraries
ORDER BY Houses.LatLngGeography.STDistance(Libraries.LatLngGeography)
)
这几乎是可以接受的,除了当我为Parks而不是我有大约100个公园的图书馆运行它时,它需要几乎10倍的时间。两个表都分别正确构造了名为IX_Houses_LatLngGeography和IX_Libraries_LatLngGeography的空间索引,但到目前为止,我还无法弄清楚如何使我的查询使用它们。
有没有办法提高查询的效果?
答案 0 :(得分:1)
使用“索引提示”。
UPDATE Houses
SET NearestLibrary = (
SELECT TOP 1 Name
FROM Libraries WITH(INDEX( SPATIAL_INDEX_NAME_HERE ))
ORDER BY Houses.LatLngGeography.STDistance(Libraries.LatLngGeography)
)
答案 1 :(得分:0)
好吧,我使用临时表稍微降低了执行时间。这是我的最终结果查询:
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尝试提供帮助。