执行ST_DUMP时,PostGIS查询不使用gist索引(ST_UNION

时间:2013-02-14 13:26:15

标签: sql postgresql postgis spatial-index

我的查询:

DROP TABLE IF EXISTS tmp;
CREATE TEMP TABLE tmp AS SELECT *, ST_BUFFER(the_geom::GEOGRAPHY, 3000)::GEOMETRY AS buffer FROM af_modis_master LIMIT 20000;
CREATE INDEX idx_tmp_the_geom ON tmp USING gist(buffer); 
EXPLAIN SELECT (DUMP(ST_UNION(buffer))).path[1], (DUMP(ST_UNION(buffer))).geom FROM tmp;

EXPLAIN的输出:

Aggregate  (cost=1705.52..1705.54 rows=1 width=32)
  ->  Seq Scan on tmp  (cost=0.00..1625.01 rows=16101 width=32)

Seq Scan意味着它没有使用索引,对吗?为什么不呢?

(这个问题首先发布在这里:https://gis.stackexchange.com/questions/51877/postgis-query-not-using-gist-index-when-doing-a-st-dumpst-union。对于重新发布道歉,但这里的社区更加活跃,所以或许可以更快地提供答案。)

更新:即使添加一个基于缓冲区过滤的where子句也会导致Seq Scan:

ANALYZE tmp;
EXPLAIN SELECT (DUMP(ST_UNION(buffer))).path[1], (DUMP(ST_UNION(buffer))).geom FROM tmp WHERE ST_XMIN(buffer) = 0.0;

1 个答案:

答案 0 :(得分:0)

像你这样的查询永远不会使用索引。这样做可以替换重要的随机磁盘I / O(甚至可能除了正常的磁盘I / O)来扫描表。

实际上,您没有选择标准,因此索引速度会慢于仅按物理顺序从磁盘中提取数据并进行处理。

现在,如果您只提取索引可能有帮助的where条件的单行,那么您可能会发现它可能会使用索引,具体取决于表的大小。非常小的表永远不会使用索引,因为额外的随机磁盘I / O永远不会成功。请记住,没有任何查询计划能够通过单个页面进行顺序扫描....