【问题标题】:Cluster on a spatial index基于空间索引的聚类
【发布时间】:2015-06-10 22:57:40
【问题描述】:

我正在尝试对空间局部性进行聚类(不仅仅是创建空间索引),但 SQL Server 不允许这样做。要创建空间索引,它首先要我创建一个聚集的主键,在它上面聚集没有任何意义。我想创建一个空间索引,然后以某种方式在空间位置上进行聚类。

我有一个想法来创建将每个几何图形放入某个 bin 中的 bin,然后得到一些整数。然后将其设置为所需的聚集主键,这样至少我的一些数据在空间上聚集在一起。

我有点困惑 SQL 服务器还没有这样做,所以要么我错过了如何做到这一点,要么很可能有人已经想到了这一点,有人可以提出一个足够好的解决方案。

我想在空间位置上进行聚类,因为我正在处理大数据,我做的第一个过滤器是按空间位置(创建地图图块),没有在空间位置上进行聚类,我的页面现在基于一些无意义的自动增量而分散整数。

如果没有提出按空间位置进行分箱的简单实现,我想我可以将几何体的边界切割成相等的正方形,然后为每个中心点运行一个距离公式包括与该 bin 相交的所有几何图形。

这不是特定于 SQL 服务器的,我正在寻找解决空间位置上的索引/聚类的通用方法。我假设非 mssql 数据库可能内置了此功能。

【问题讨论】:

    标签: sql-server database spatial spatial-index


    【解决方案1】:

    无论实施如何,我都看不出这怎么可能。具体来说,集群键的想法是让您(数据库引擎)可以告诉应该存储行的顺序。这对于所有其他数据类型(及其组合)都是可能的,因为最终您可以判断给定元组是更大、更小还是等于另一个。对于广义空间数据,您会使用什么度量来表示一个实例大于或小于另一个实例?尺寸?接近原产地?其他措施?在一般情况下没有明确的定义,所以你不能这样做。

    但一切都没有丢失。只需为您的行分配一个任意标识符(即标识列或由序列填充的列)并在其上进行聚类。然后你可以在上面放一个空间索引然后去镇上。查看您的问题,如果您的垃圾箱是预定义的,您可以将它们放在另一个表中并使用STIntersects 进行连接。但这可能是本末倒置。

    【讨论】:

    • 是的,我现在聚集在任意键上并添加了我的空间索引。 SQL 服务器忽略了空间索引,因为它宁愿首先使用与正在连接的表不同的集群 PK,然后只对我的地理表上的 PK 进行扫描(它这样做是因为现在如果它确实使用了我的空间索引然后数据会分散)。如果我能找到一种以某种有意义的空间方式进行集群的方法,我认为 SQL Server 会使用我的空间索引,因为叶节点不会位于此类非集群页面上。
    • 优化器对空间索引的使用不是很好。您是否尝试过使用查询提示来影响优化器使用它?
    • 在这种情况下,它是明智之举,因为几何表是随机聚集的(因为我聚集在自动增量键上)。有 1 亿个几何图形,它可以找到 2,000 个结果。这 2,000 个结果可能属于接近 2,000 个单独的页面,因为垃圾聚类。我的假设是 SQL Server 意识到,虽然空间索引会更好地进行过滤,但它过于未聚集,因此选择使用不太好但更聚集的过滤器。
    • 如果我能以某种方式聚集在诸如邮政编码之类的东西上,我最好它必须做的页面读取数量要少得多,更像是 1-100。我没有这些几何图形的邮政编码......曾经的解决方案选项将是某种类型的邮政编码来进行长/纬度查找,或者类似的东西。
    • 您非常关注集群作为所有性能问题的解决方案。扩展你的思维。正如我之前所说,优化器(根据我的经验)在正确选择空间索引方面很糟糕。此外,使用“几何”和“邮政编码”这两个词的危险信号;如果您的数据代表地球上的点,您应该使用地理类型。
    猜你喜欢
    • 2018-09-02
    • 2015-02-22
    • 2012-11-03
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 2020-08-29
    • 2019-04-14
    • 2013-02-04
    相关资源
    最近更新 更多