如何使用STDistance提高SQL Server 2008中的地理更新查询的性能?

时间:2011-11-17 23:51:25

标签: sql performance sql-server-2008 tsql spatial

我使用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的空间索引,但到目前为止,我还无法弄清楚如何使我的查询使用它们。

有没有办法提高查询的效果?

2 个答案:

答案 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尝试提供帮助。