【问题标题】:Can I create a "Covering, Spatial" index in SQL Server 2008?我可以在 SQL Server 2008 中创建“覆盖、空间”索引吗?
【发布时间】:2010-11-23 18:40:37
【问题描述】:

我目前有一个网站,其中包含一个包含 Lat/Long 浮点列的表,以及这 2 列以及我需要检索的另一列的索引。

我一直在查询这个表,以获取从某个点开始落在一个半径内的行(我实际上是用一个正方形来表示速度),但我只需要已经索引的字段,所以这个索引是实际上覆盖,执行计划只有2个步骤:

Index Seek  (cost: 100%) and SELECT (cost: 0%)

现在,我正在尝试利用 SQL 2008 的空间功能。我已经创建了 Geography 列,填充了它,创建了空间索引,这些都很好。

这一切都很好,除了执行计划有一百万个步骤,并且 74% 的时间花在聚集索引搜索上,它将在空间索引中找到的行连接到实际表中,以获取其余数据...
(空间索引搜索占执行计划成本的 1%)

因此,显然,它正在适当地使用空间索引,并使用我的“常规”索引在 Lat/Long 上比以前更快地找到我需要的记录,但是加入主表正在杀死我,空间查询需要是我旧的 7 倍。

有什么方法可以向空间索引添加更多列,以便它可以覆盖并可以一步完成,就像以前一样?
我还能做些什么来改善这种情况吗?


更新:我发现“常规”索引可以使用 INCLUDE 关键字“包含”其他列(我不知道,我以前只是在索引本身中包含列)
根据文档here,该子句不是空间索引的选项... 有什么想法吗?

谢谢!
丹尼尔

【问题讨论】:

    标签: sql-server-2008 spatial covering-index spatial-index


    【解决方案1】:

    不,遗憾的是,目前无法创建覆盖空间索引 - 查询将始终对基表进行书签查找,以获取该行的地理值。

    对于 STIntersects,这显然总是需要的,因为我们仍然需要对实际的地理对象执行二次过滤,以验证它实际上与参数对象相交。但是,如果您不需要确切的答案并且可以使用 Filter(),则可以从索引中提供主键列,而根本不查找基表。支持这一点是我们正在考虑的下一个版本。

    在加快当前查询的速度方面,您是否尝试过使用 Filter() 并使用 sp_help_geography_index 的输出调整索引?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-03
      • 2018-07-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多