SELECT * FROM join_a a JOIN join_b b ON a.b = b.b; |
执行计划下:
QUERY PLAN
----------------------------------------------------------------------------------------------------------------------
Hash Join (cost=58.35..14677.69 rows=1074607 width=16) (actual time=23.374..23.384 rows=10 loops=1)
Hash Cond: (a.b = b.b)
-> Seq Scan on join_a a (cost=0.00..2248.10 rows=100010 width=8) (actual time=0.495..12.551 rows=100010 loops=1)
-> Hash (cost=31.49..31.49 rows=2149 width=8) (actual time=0.614..0.614 rows=1000 loops=1)
Buckets: 32768 Batches: 1 Memory Usage: 40kB
-> Seq Scan on join_b b (cost=0.00..31.49 rows=2149 width=8) (actual time=0.009..0.183 rows=1000 loops=1)
Total runtime: 23.716 ms
(7 rows) |
优化分析
- 分析执行计划可知,在顺序扫描阶段耗时较多。
- 建议在语句中手动添加JOIN列的非空判断,修改后的语句如下所示。
SELECT * SELECT * FROM join_a a JOIN join_b b ON a.b = b.b where a.b IS NOT NULL;
执行计划如下:
QUERY PLAN --------------------------------------------------------------------------------------------------------------------- Hash Join (cost=58.22..14560.97 rows=1063762 width=16) (actual time=13.237..13.247 rows=10 loops=1) Hash Cond: (a.b = b.b) -> Seq Scan on join_a a (cost=0.00..2248.10 rows=99510 width=8) (actual time=12.417..12.422 rows=10 loops=1) Filter: (b IS NOT NULL) Rows Removed by Filter: 100000 -> Hash (cost=31.49..31.49 rows=2138 width=8) (actual time=0.566..0.566 rows=1000 loops=1) Buckets: 32768 Batches: 1 Memory Usage: 40kB -> Seq Scan on join_b b (cost=0.00..31.49 rows=2138 width=8) (actual time=0.011..0.229 rows=1000 loops=1) Filter: (b IS NOT NULL) Total runtime: 13.556 ms (10 rows)
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




