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

如何使用STDistance提高SQL Server 2008中地理位置更新查询的性能?,sql,performance,sql-server-2008,tsql,spatial,Sql,Performance,Sql Server 2008,Tsql,Spatial,我在SQL Server 2008(不是R2)中使用STDistance()进行空间更新查询时遇到了严重的性能问题。目标很简单:我有一个包含120000条记录的表,包含列和最近的库。第二个表有12条记录,库,列为名称。两个表都有一个地理列LatLngGeography。我想用库中最近的库的名称更新Houses.NearestLibrary 运行此查询大约需要50秒: UPDATE Houses SET NearestLibrary = ( SELECT TOP 1 Name

我在SQL Server 2008(不是R2)中使用STDistance()进行空间更新查询时遇到了严重的性能问题。目标很简单:我有一个包含120000条记录的表,包含列和最近的库。第二个表有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,但到目前为止,我无法确定如何让我的查询使用它们

有没有办法提高查询的性能?

使用“索引提示”


嗯,我使用了一个临时表来减少执行时间。以下是我的最终结果查询:

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的帮助。

我在此处尝试了您的建议,但引发了以下错误:由于此查询中定义的提示,查询处理器无法生成查询计划。在不指定任何提示和不使用SET-FORCEPLAN的情况下重新提交查询。表上有空间索引吗?这是我的空间索引。有什么问题吗?在[dbo].[Libraries]([LatLngGeography])上使用地理网格(网格=(级别1=中等,级别2=中等,级别3=中等,级别4=中等)创建空间索引[NDX\u库\u LatLngGeography],每个对象的单元格=16,填充索引=关闭,在临时数据库中排序=关闭,删除现有的=关闭,允许行锁定=打开,允许页锁定=打开)打开[主]GO`Urgh。抱歉-我无法确定如何在我的评论中插入换行符。我是StackOverflow新手,我在这里插入了NDX\u库\u Latlngography来代替空间\u索引\u名称\u,但在其他方面代码与您建议的完全相同。
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