gpt4 book ai didi

sql-server-2008-r2 - 空间索引减慢查询速度

转载 作者:行者123 更新时间:2023-12-04 07:55:36 27 4
gpt4 key购买 nike

背景

我有一个包含代表客户区域的 POLYGONS/MULTIPOLYGONS 的表:

  • 该表包含大约 8,000 行
  • 大约 90% 的多边形是圆形
  • 其余的多边形代表一个或多个州、省或其他地理区域。这些形状的原始多边形数据是从 US census data 导入的。 .
  • 该表在主键上有一个空间索引和一个聚集索引。未更改默认 SQL Server 2008 R2 设置。每个对象 16 个单元格,所有级别中等。

  • 这是一个简化的查询,可以重现我遇到的问题:
    DECLARE @point GEOGRAPHY = GEOGRAPHY::STGeomFromText('POINT (-76.992188 39.639538)', 4326)

    SELECT terr_offc_id
    FROM tbl_office_territories
    WHERE terr_territory.STIntersects(@point) = 1

    一个看似简单、直接的查询需要 12 或 13 秒的时间来执行,而对于这样一个简单的查询,它的执行计划似乎非常复杂。

    Execution Plan

    在我的研究中,有几个来源建议向查询添加索引提示,以确保查询优化器正确使用空间索引。添加 WITH(INDEX(idx_terr_territory))没有效果,从执行计划中可以清楚地看出,无论提示如何,它都在引用我的索引。

    减少多边形

    从美国人口普查数据导入的领土多边形似乎可能过于复杂,因此我创建了第二列,并测试了具有不同容差程度的简化多边形(w/ Reduce() method)。对新列运行与上述相同的查询产生以下结果:
  • 无减少:12649ms
  • 减少 10:7194 毫秒
  • 减少 20:6077 毫秒
  • 减少 30:4793 毫秒
  • 减少了 40:4397 毫秒
  • 减少 50:4290 毫秒

  • 显然朝着正确的方向前进,但降低精度似乎是一个不雅的解决方案。这不是索引应该用于的吗?对于这样一个基本查询,执行计划似乎仍然异常复杂。

    空间索引

    出于好奇,我去掉了空间索引,结果惊呆了:
  • 没有索引的查询速度更快(低于 3 秒,没有减少,低于 1 秒,减少容差 >= 30)
  • 执行计划看起来很简单:

  • Execution Plan w/o index

    我的问题
  • 为什么我的空间索引会减慢速度?
  • 为了加快查询速度,真的有必要降低多边形的复杂性吗?降低精度可能会导致后续出现问题,并且似乎不会很好地扩展。

  • 其他注意事项
  • SQL Server 2008 R2 Service Pack 1 已应用
  • Further research suggested在存储过程中运行查询。试过这个,似乎没有任何改变。
  • 最佳答案

    我的第一个想法是检查索引的边界坐标;看看它们是否覆盖了您的整个几何图形。其次,空间索引保留在默认的 16MMMM,根据我的经验,性能很差。我不确定为什么这是默认设置。我在 this answer 上写了一些关于空间索引调整的文章。 .

    首先确保索引涵盖所有几何图形。然后尝试将每个对象的单元格减少到 8 个。如果这两件事都没有带来任何改进,那么在我上面链接的答案中运行空间索引调整过程可能是值得的。

    最后的想法是,州边界有如此多的顶点和许多州边界多边形,您正在测试与其相交,很可能需要那么长时间而不减少它们。

    哦,既然已经两年了,从SQL Server 2012开始,现在有了GEOMETRY_AUTO_GRID tessellation它会为您进行索引调整,并且在大多数情况下都做得很好。

    关于sql-server-2008-r2 - 空间索引减慢查询速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9708323/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com