使用STContains比较地理列会减慢SQL Server中的查询速度

时间:2016-12-21 11:34:44

标签: sql sql-server sql-server-2012 spatial-query spatial-index

我想使用StContains函数比较两个地理列,但它会减慢查询速度并在30-40秒后获得输出,这是一个巨大的性能问题。

我正在使用以下查询:

SELECT  DISTINCT
            T.[LocationID], G.[Boundary].STContains(ESP.GeographyValue)
    FROM    [#TempTable] T
    CROSS JOIN [dbo].[GeographyTable] G
    INNER JOIN [dbo].LocationTable ESP ON T.LocationID = ESP.LocationID
    WHERE   G.[ID] = 1

此处边界 GeographyValue 均为地理数据类型。

如果我删除 G. [Boundary] .STContains(ESP.GeographyValue),则查询将在0秒内执行,因此主要的性能问题是由StContains引起的。

结果集包含 7000条记录,这可能不是问题。

更新

我已经为两个列添加了空间索引,但执行速度仍然很慢。通过运行一个简单的查询需要10秒。我在查询下面使用:

select ES.* from LocationTable ES INNER JOIN GeographyTable G ON ES.GeographyValue.STEquals(G.Boundary) = 1 Where G.Id = 1

我也试过STContains,但仍然没有运气。

1 个答案:

答案 0 :(得分:3)

使用下面的代码强制您的代码使用空间索引 [dbo].[GeographyTable] G WITH (INDEX(SI_Geofence_Boundary))

您修改后的查询将如下所示,

SELECT  DISTINCT
            T.[LocationID], G.[Boundary].STContains(ESP.GeographyValue)
    FROM    [#TempTable] T
    CROSS JOIN [dbo].[GeographyTable] G WITH (INDEX(SI_Geofence_Boundary))
    INNER JOIN [dbo].LocationTable ESP ON T.LocationID = ESP.LocationID
    WHERE   G.[ID] = 1

它会将执行时间从30-40秒减少到2-3秒。

有关详细信息,请查看link