SQL Server空间索引设置

时间:2015-01-25 22:04:58

标签: sql-server geospatial spatial-index

我目前有两个表城市和列表,都有一个名为Position的字段,这是一个空间字段。 我的问题是我是否正确设置了索引,还是应该添加/删除某些索引? 对于我没有在地图上显示它们的城市,我只使用一个与城市相关的查询,即我拿一个纬度/长度,我得到最近的50个城市,对于列表我也做最近的,我给它们展示在我这样做的地图上

http://tinyurl.com/on9454y

对于这两个表,我有两个索引,每个索引都设置如下。

256 HHHH

/****** Object:  Index [Position_Index]    Script Date: 1/25/2015 3:56:50 PM ******/
CREATE SPATIAL INDEX [Position_Index] ON [dbo].[Listings]
(
[Position]
)USING  GEOGRAPHY_GRID 
WITH (GRIDS =(LEVEL_1 = HIGH,LEVEL_2 = HIGH,LEVEL_3 = HIGH,LEVEL_4 = HIGH), 
CELLS_PER_OBJECT = 256, PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO

16 HHHH

/****** Object:  Index [Spatial_Index]    Script Date: 1/25/2015 3:58:23 PM ******/
CREATE SPATIAL INDEX [Spatial_Index] ON [dbo].[Listings]
(
[Position]
)USING  GEOGRAPHY_GRID 
WITH (GRIDS =(LEVEL_1 = HIGH,LEVEL_2 = HIGH,LEVEL_3 = HIGH,LEVEL_4 = HIGH),    
CELLS_PER_OBJECT = 16, PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO

使用sql server 2012

2 个答案:

答案 0 :(得分:1)

您只需要每个表中“位置”字段的一个索引。拥有2是多余的,并且从任何数据库写入这些字段必须更新两者的角度来看都会损害性能。您确实需要在两个表中都有索引,因为您正在寻找两个城市和列表中的最近点。

就哪一个开头而言,取决于您是否使用积分或区域。

对于区域(即不仅仅是点),您应该从每个对象的16个单元格开始,因为根据MSDN

  

默认情况下,每个对象的单元格限制为每个对象16个单元格   为大多数人提供了空间和精度之间令人满意的折衷   空间索引。

我会将其应用于城市,并查看您的查询的执行情况。如果不满意,请增加它(可能只是保持加倍),直到看不到性能增益。由于上述原因,我认为16应该对你很好,但它将是非常具体的数据。同样,只有你不使用积分才有意义。

如果您的数据仅包含点数(在您的情况下似乎很可能,至少对于列表而言),那么CPO值并不重要,您应该通过将每个级别设置为HIGH来获得非常好的性能,就像您已经完成的那样。来自文章here

  

在点数据的情况下,在大多数情况下,如果不是全部,   所有网格级别设置为HIGH的空间索引都优于大写的情况   其他配置。由于我们正在处理点数据,所以   CELLS_PER_OBJECT设置无关紧要,可以设置为任何合法的   值(1-8192)没有效果。

参考

如果您还没有这样做,我强烈建议阅读这些文章:

答案 1 :(得分:0)

我同意麦迪逊所说的话。 虽然我想补充一点,但我发现大多数查询都需要提示才能使用空间索引,例如:

SELECT *
FROM geoTable WITH (INDEX (spatial_index))
WHERE geoColumn.STDistance(@g) < 100

请记住,如果您正在进行大量连接和/或使用空间索引的子句实际上可能不比扫描更快,那么针对不同情况测试两种方案。

如果您的表格相当大(100万+行),空间索引往往会变慢。考虑将它们拆分为单独的表,无论是每个州还是国家,因为您无法对这些索引进行分区。