【问题标题】:Spatial gist index in postgis - performancepostgis 中的空间要点索引 - 性能
【发布时间】:2012-05-28 09:00:43
【问题描述】:

我对 gist 索引有疑问。 我有表格'国家'和'geog'(地理,多面体)柱状。 我也有这个专栏的要点索引。 这个使用 ST_CoveredBy() 对 2 行表(每个“geog”大约 5MB)的简单查询需要 13 秒(查询结果正确):

select c."ID" from gis.country c where ST_CoveredBy(ST_GeogFromText('SRID=4326;POINT(8.4375 58.5791015625)'), c."geog") =true

当我删除索引时,查询也需要 13 秒。

我已经做了什么:

编辑

查询计划 -

Index Scan using sindx_country_geography_col1 on country c  (cost=0.00..8.52 rows=1 width=4)
  Index Cond: ('0101000020E61000000000000000E0204000000000204A4D40'::geography && "geog")
  Filter: _st_covers("geog", '0101000020E61000000000000000E0204000000000204A4D40'::geography)

【问题讨论】:

  • 请发布查询计划。该索引几乎不会用于具有2 行的表。
  • 在国家 c 上使用 sindx_country_geography_col1 进行索引扫描(成本=0.00..8.52 行=1 宽度=4)索引条件:('0101000020E61000000000000000E0204000000000204A4D40'::geography && "geog")过滤器:_st_cover ", '0101000020E61000000000000000E0204000000000204A4D40'::地理)
  • 查询确实使用了索引。

标签: postgresql indexing gis postgis spatial


【解决方案1】:

您不会看到索引查询对只有两行的表的任何好处。只有当您有数百或更多行要查询时,索引的好处才会发挥作用。

我猜你有两个非常详细的国家多面体。有一些策略可以将它们划分为网格以提高性能。您如何将您的国家划分为网格应基于 (1) 您感兴趣的区域的密度(您最有可能查询的区域),以及 (2) 多面体的复杂性或顶点的密度。

【讨论】:

  • Mike 说得对,索引在这里不会有任何影响...st_coveredby 指的是另一个函数,它指的是用 C 编写的 postGIS contrib 文件。它使用迭代过程来确定点是什么包含(我相信光线交叉逻辑)。它使查询对多边形中包含的点数敏感以提高性能...大多边形的执行速度明显较慢,而您的 5mb 多边形非常庞大。同意 Mike 的解决方案,但另一种可能性是考虑优化您的 postgres 服务器或可能为其提供更多硬件。
  • 我已经分割了我的国家多边形,现在它工作得很好。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2018-11-20
  • 2015-08-09
  • 2021-08-26
  • 2019-02-17
  • 2013-10-14
  • 2017-10-27
  • 2014-06-02
  • 1970-01-01
相关资源
最近更新 更多