greenplum5.3空间分析不走索引

新手上路,请多包涵

各位大神,小弟遇到个纳闷的问题请教。使用greenplum最新版本+postgis2.1.5进行空间分析,geometry字段已建立gist索引,但是查询时却不走索引。同样的数据在postgresql中是能正常走索引的,导致GP的性能反而比PG还低得多了。为简化问题,设置场景如下:
两张简单的表做空间分析,表结构一样,主要就是geometry字段做叠加分析。A表和B表均有两个字段,objectid,geom.查询sql:select a.objectid from a,b where _ST_Intersects(a.geom,b.geom) = true 就是查询出有相交的数据。使用分析语句,很清楚的看到在PG里面的执行计划是走了控件索引的:
Gather (cost=1000.28..50073671.73 rows=14816593 width=8)
Workers Planned: 6
-> Nested Loop (cost=0.28..22260691.60 rows=2469432 width=8)

     ->  Parallel Seq Scan on dltb a  (cost=0.00..492413.47 rows=425447 width=1763)
     ->  Index Scan using idx_imp on import_cd2 b  (cost=0.28..38.77 rows=2 width=1449)
           Index Cond: (a.geom && geom)
           Filter: (_st_intersects(a.geom, geom) AND (st_area(st_geographyfromtext(('SRID=4610;'::text || st_astext(st_intersection(a.geom, geom)))), true) > '1'::double precision))

(7 rows)
但是在greenplum里却走的全表扫描:
Gather Motion 14:1 (slice2; segments: 14) (cost=0.00..8468137365.87 rows=7483140136 width=8)
-> Result (cost=0.00..8467986078.15 rows=534510010 width=8)

     Filter: (st_area(st_geographyfromtext('SRID=4610;'::text || st_astext(st_intersection(dltb.geom, import_cd2.geom))), true)) > 1::double precision
     ->  Result  (cost=0.00..8467942114.70 rows=1336275025 width=8)
           ->  Nested Loop  (cost=0.00..8467931424.50 rows=1336275025 width=1138)
                 Join Filter: _st_intersects(dltb.geom, import_cd2.geom) AND dltb.geom && import_cd2.geom
                 ->  Broadcast Motion 14:14  (slice1; segments: 14)  (cost=0.00..943.87 rows=163569 width=618)
                       ->  Table Scan on import_cd2  (cost=0.00..435.48 rows=11684 width=618)
                 ->  Table Scan on dltb  (cost=0.00..442.25 rows=28721 width=520)

Optimizer status: PQO version 2.51.0
(10 rows)
强制关闭顺序扫描后仍然是执行全表扫描.有哪位大神知道是什么原因么?谢谢

阅读 4.7k
1 个回答

1, Greenplum 默认 index scan 是禁用的,打开试试。 set enable_indexscan = on;
2, 做一下 analyze
3, 禁用 seqscan 试试。 set enable_seqscan = off;
4, 换成旧的优化器试一下。set optimizer = off;

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进