by playlyun [SQL Query] postgresql query join hash join [2020.08.13 13:12:44]
SELECT * FROM table_a a, table_b b WHERE a.id = b.id;
로 했을때 query plan을 보면 hash join을 했다고 나오는데,
left,rigt join 으로 보면 어떻게 구분되는건가요?
강제로 hash join을 사용하도록 해보니 쿼리 플랜이 각각 아래처럼 나오네요.
postgresql은 9.6에서 실행한 내용입니다. 데이터가 없어서인지 Hash Left로만 풀리네요.
postgres=# create table table_a (id int); CREATE TABLE postgres=# create table table_b (id int); CREATE TABLE postgres=# set enable_mergejoin to off; SET postgres=# set enable_nestloop to off; SET postgres=# explain analyze SELECT * FROM table_a a inner join table_b b ON a.id = b.id; QUERY PLAN ------------------------------------------------------------------------------------------------------------- Hash Join (cost=67.38..1247.18 rows=32512 width=8) (actual time=0.009..0.009 rows=0 loops=1) Hash Cond: (a.id = b.id) -> Seq Scan on table_a a (cost=0.00..35.50 rows=2550 width=4) (actual time=0.005..0.005 rows=0 loops=1) -> Hash (cost=35.50..35.50 rows=2550 width=4) (never executed) -> Seq Scan on table_b b (cost=0.00..35.50 rows=2550 width=4) (never executed) Planning time: 0.109 ms Execution time: 0.049 ms (7 rows) postgres=# explain analyze SELECT * FROM table_a a left outer join table_b b ON a.id = b.id; QUERY PLAN ------------------------------------------------------------------------------------------------------------- Hash Left Join (cost=67.38..1247.18 rows=32512 width=8) (actual time=0.005..0.005 rows=0 loops=1) Hash Cond: (a.id = b.id) -> Seq Scan on table_a a (cost=0.00..35.50 rows=2550 width=4) (actual time=0.004..0.004 rows=0 loops=1) -> Hash (cost=35.50..35.50 rows=2550 width=4) (never executed) -> Seq Scan on table_b b (cost=0.00..35.50 rows=2550 width=4) (never executed) Planning time: 0.109 ms Execution time: 0.036 ms (7 rows) postgres=# explain analyze SELECT * FROM table_a a right outer join table_b b ON a.id = b.id; QUERY PLAN ------------------------------------------------------------------------------------------------------------- Hash Left Join (cost=67.38..1247.18 rows=32512 width=8) (actual time=0.006..0.006 rows=0 loops=1) Hash Cond: (b.id = a.id) -> Seq Scan on table_b b (cost=0.00..35.50 rows=2550 width=4) (actual time=0.004..0.005 rows=0 loops=1) -> Hash (cost=35.50..35.50 rows=2550 width=4) (never executed) -> Seq Scan on table_a a (cost=0.00..35.50 rows=2550 width=4) (never executed) Planning time: 0.104 ms Execution time: 0.036 ms (7 rows)