SQL Server 2008 STFilter性能

SQL Server 2008 STFilter性能,sql,sql-server,spatial-query,spatial-index,Sql,Sql Server,Spatial Query,Spatial Index,让我先说一下,我对空间索引是新手。我知道有一个存储过程正在使用我的空间索引(占查询的1%),但是一个过滤器正在减慢我的查询速度(占查询的52%)。我正在努力想办法加快速度,因为我没有多少记录返回(大约1000条) 场景 我有一张订单表。每个记录都有一个产品来源地的Zipcode,以及一个产品发货目的地的Zipcode 我还有一张全国所有zipcode的表格,以及基于lat/long的zipcode的地理位置点(已作为表格中的一列计算) 我需要获取来自传入Zipcode半径75英里范围内的所有订单

让我先说一下,我对空间索引是新手。我知道有一个存储过程正在使用我的空间索引(占查询的1%),但是一个过滤器正在减慢我的查询速度(占查询的52%)。我正在努力想办法加快速度,因为我没有多少记录返回(大约1000条)

场景

我有一张订单表。每个记录都有一个产品来源地的
Zipcode
,以及一个产品发货目的地的
Zipcode

我还有一张全国所有zipcode的表格,以及基于lat/long的zipcode的
地理位置
点(已作为表格中的一列计算)

我需要获取来自传入Zipcode半径75英里范围内的所有订单,并将其发送到传入目标Zipcode半径75英里范围内的Zipcode

这是我的SQL。它能工作,但我需要更快。我认为这不应该超过1秒

DECLARE 
    @oCenterPoint GEOGRAPHY,
    @dCenterPoint GEOGRAPHY,
    @originCircle GEOGRAPHY,
    @destCircle GEOGRAPHY,
    @radiusInMeters DECIMAL

SELECT @oCenterPoint=GeographyPoint FROM MyZipcodeTable WHERE Zipcode=@prmOriginZip
SELECT @dCenterPoint=GeographyPoint FROM MyZipcodeTable WHERE Zipcode=@prmDestZip
SET @radiusInMeters = 75 * 1609.344

/* build the two circles to use STIntersects() function */
SET @originCircle = @oCenterPoint.Reduce(400).STBuffer(@radiusInMeters).Reduce(1000)
SET @destCircle = @dCenterPoint.Reduce(400).STBuffer(@radiusInMeters).Reduce(1000)


/* get our zips that are in our origin radius */
CREATE TABLE #oZips (Zipcode VARCHAR(15) NOT NULL PRIMARY KEY)
INSERT INTO #oZips ( Zipcode )
SELECT z.Zipcode
FROM MyZipcodeTable  z
WHERE @originCircle.STIntersects(z.GeographyPoint)=1

/* get our zips that are in our destination radius */
CREATE TABLE #dZips (Zipcode VARCHAR(15) NOT NULL PRIMARY KEY)  
INSERT INTO #dZips ( Zipcode )
SELECT z.Zipcode
FROM MyZipcodeTable  z
WHERE @destCircle.STIntersects(z.GeographyPoint)=1
这是查询最慢的部分。将“我的订单”表内部连接到这些原始和目标zip表很快。插入有效的zipcodes是导致性能问题的原因。就像我上面说的,它使用了一个空间索引,但是在执行计划中,有一个过滤器的成本是52%。它使用CASE语句执行某些操作,该语句必须是STIntersects()函数的一部分

此外,即使它使用我的空间索引,我也看到它使用我的聚集索引,占查询的37%。我的空间索引中没有包含列。不知道你能不能,也不知道我是怎么做到的


有没有向任何人发出红旗?任何重定向都是感激的

包括Orders表的DDL。使用
的实际执行计划,其中@destcirle.STDistance(z.GeographyPoint)=1
?这是打字错误吗(即,你是指
STIntersects
)?@BenThul正确-我是指STIntersects。我已经尝试了很多不同的方法来调整性能,哈哈。你在
GeographyPoint
列上定义了空间索引吗?@Damien\u我不相信。正在使用空间索引,我已经使用临时存储过程确认了这一点,并且进入存储过程缓存并确保。