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)
强制关闭顺序扫描后仍然是执行全表扫描.有哪位大神知道是什么原因么?谢谢
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
1, Greenplum 默认 index scan 是禁用的,打开试试。 set enable_indexscan = on;
2, 做一下 analyze
3, 禁用 seqscan 试试。 set enable_seqscan = off;
4, 换成旧的优化器试一下。set optimizer = off;