sql server空间索引性能

mdm*_*m20 6 sql-server spatial

我有一张表,里面有大约 200 万条记录。我创建了一个空间索引,使用边界框以外的默认值。我一直注意到有些查询非常快,有些则非常慢。决定因素出现在查询中使用的多边形的大小。

在较大的搜索区域,使用WITH(INDEX(SIX_FT5))会大大减慢查询速度(从 0 秒到 15 秒以上)。在较小的搜索区域,情况正好相反。

以下是我正在测试的一些查询:

快速地:

SELECT TOP(1000) 
  * 
FROM [FT5] 
WHERE 
  shape.STIntersects(geometry::STGeomFromText('POLYGON ((-133462.805381701 -668610.241000959, 2934415.68824241 -668610.241000959, 2934415.68824241 2200521.65831815, -133462.805381701 2200521.65831815, -133462.805381701 -668610.241000959))', 2264)) = 1
Run Code Online (Sandbox Code Playgroud)

减缓:

SELECT TOP(1000) 
  * 
FROM [FT5] WITH(INDEX(SIX_FT5)) -- Index hint is the only difference
WHERE 
  shape.STIntersects(geometry::STGeomFromText('POLYGON ((-133462.805381701 -668610.241000959, 2934415.68824241 -668610.241000959, 2934415.68824241 2200521.65831815, -133462.805381701 2200521.65831815, -133462.805381701 -668610.241000959))', 2264)) = 1
Run Code Online (Sandbox Code Playgroud)

为什么 WITH 子句有时会减慢速度?

小智 3

您的索引会减慢某些查询的速度,但不会减慢其他查询的速度,这与空间索引的工作方式有很大关系:

空间索引分为 4 个级别,并分为网格。对于每个级别,您将能够指定分别对应于 16、64 或 256 个细胞的低、中或高密度。然后,在每个单元格内,这些单元格将根据其设置细分为下一个较低级别。

所有这些意味着,根据您的设置和数据分布,您可能需要调整不同级别的密度以获得适当的索引性能。这也可能意味着您需要根据边缘情况平衡此数据的主要查询的性能。

请查看这篇 Microsoft TechNet 库文章以获取更详细的说明:

空间索引概述