PostgreSQL / PostGIS空间索引-无速度


15

我在PostgreSQL / PostGIS数据库中有一个空间表。其中的每一行都代表一个多边形。它具有以下形式:

+----+--------+
|gid |   way  |
+----+--------+
|241 | 01030..|

几何列是“ way”,其中包含多边形的几何。在WKT中是:POLYGON(('....'))。我正在此表上执行很多ST_Contains查询,以测试彼此是否包含两个多边形,例如:

Select ST_Contains(a.way, b.way) From table AS a, table AS b Where a.gid = 15 And b.gid = 16

我想知道如何加快查询速度,并在表上添加空间索引:

CREATE INDEX table_way_gist ON table USING gist(way);

但实际上我看不到速度提高。在执行ST_Contains查询之前,我在用所有多边形填充表格之后创建索引。填写表格之前是否应该添加索引?表格上是否有使用索引的特殊要求?几何圆柱路径的投影(纬线)设置为900913。

我正在使用:psql(PostgreSQL)9.1.4 / POSTGIS =“ 1.5.3”

Answers:


16

在您的问题中表达的查询最有效的索引是gid上的索引,因为它是出现在where表达式中的唯一列:

 CREATE INDEX table_gid ON table (gid);

您可以放心地删除要点索引,因为它只会占用空间,并且会降低插入/更新/删除的速度。

详细说明

正如我所说,在您的情况下,最有效的索引是gid索引,因为它将使db引擎更快地检索行(通常,检索是过程中最慢的部分)。之后,它可能会更好地计算出

  ST_Contains(a.way, b.way)

无需查看索引即可进行压缩。原因是查询计划人员可能会估计,在两个列上查找要点索引直接查找a.wayb.way相比所花费的额外成本不值得,因为要查找的总行数可能很小,尤其是在索引唯一的情况下。

作为一个经验法则,请记住,对于小型数据集,计划者可能更喜欢表扫描而不是索引扫描(数据集大小是通过查看表统计信息来估算的)。


这使我更清楚了这个问题。我会试试看。因此,如果将ST_Contains()查询放入WHERE子句中,则空间索引实际上应该会有所帮助吗?我想我必须重新组织我的脚本才能在WHERE子句中调用ST_Contains。目前,我正在遍历所有多边形,并始终分别测试其中两个。
MichiMichbeck

?? 您是在说空间索引会减慢速度吗?这对我来说是个新事物,因为在我工作的地方,每张桌子都有空间索引,我想知道这是否是个坏习惯
Luffydude

13

正如unicoletti所说的,仅当您在WHERE表达式中使用ST_Contains()时,geometry列中的gist索引才有效。

例如,如果您想知道所有包含彼此的多边形,则可以使用以下方法:

SELECT a.gid, b.gid
FROM table AS a, table as b
WHERE a.gid != b.gid and ST_Contains(a.way, b.way)

在这种情况下,取决于表的大小和几何图形的复杂性,要​​点索引应可显着提高速度,因为ST_Contains将首先在比较多边形的边界框之前对其进行过滤,然后再实际检查其完整的几何图形。您可以在《OpenGeo教程》中看到一个小的解释。


是的,我明白了,我需要此查询来涉及索引边界测试。Thx Alexandre。(我会把unicoletti标记为解决方案,因为他很快
就把
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.