我想使用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,但仍然没有运气。
答案 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