【问题标题】:SQL Server Spatial Indexes SetupSQL Server 空间索引设置
【发布时间】:2015-01-25 22:04:58
【问题描述】:

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

http://tinyurl.com/on9454y

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

256 哈哈哈哈

/****** 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 哈哈哈哈

/****** 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

【问题讨论】:

    标签: sql-server geospatial spatial-index


    【解决方案1】:

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

    从哪一个入手,要看你用的是点还是面积。

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

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

    我会将其应用于城市,看看您的查询效果如何。如果不满意,增加它(可能只是继续加倍),直到你看不到性能提升。由于上述原因,我想 16 对您来说应该可以正常工作,但它将是非常具体的数据。同样,只有在您不使用积分时才有意义。

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

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

    参考文献

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

    【讨论】:

    • 关于数据本身你需要了解什么,我可以提供更多信息以获得更准确的答案
    • 一些可以提供帮助的数据:(1) 大约有多少个城市以及您多久添加一次?对于列表也是如此。 (2) 您的地理列只是点还是更复杂的区域? (3) 多久查询一次这些数据? (4) 你计划覆盖的区域有多大?世界?一县?介于两者之间?
    • 我有 2 个区域(2 个站点),其中 1 个覆盖全球,大约有 145,000 个城市和 900,000 个列表,并且从未添加新列表,此列表非常静态,可能每年更新一次。 2.我覆盖加拿大和城市,并且每天都会添加新列表,有时一旦添加了 1k 个列表的城市,有时会添加几个城市
    • @Madision 你得到赏金了吗?我忘了设置它,如果没有让我知道该怎么做才能确保你得到它
    • 我没有,因为它过期了,但没什么大不了的。只是希望这对你有用。
    【解决方案2】:

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

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

    请记住,如果您正在执行多个连接和/或使用空间索引的 where 子句实际上可能并不比扫描快,因此请针对不同情况测试这两种情况。

    如果您的表相当大(超过 100 万行),空间索引往往会变慢。考虑按州或国家将它们拆分到单独的表中,因为您无法对这些索引进行分区。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-10
      • 1970-01-01
      • 1970-01-01
      • 2022-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多