greenplum5.3空间分析不走索引

发布于 2022-09-06 10:20:20 字数 1983 浏览 27 评论 0

各位大神,小弟遇到个纳闷的问题请教。使用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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

青衫负雪 2022-09-13 10:20:20

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文