해시 조인 vs 해시 세미 조인


8

PostgreSQL 9.2

나는 사이의 차이를 이해하기 위해 노력하고있어 Hash Semi Join단지를 Hash Join.

다음은 두 가지 쿼리입니다.

나는

EXPLAIN ANALYZE SELECT * FROM orders WHERE customerid IN (SELECT
customerid FROM customers WHERE state='MD');

Hash Semi Join  (cost=740.34..994.61 rows=249 width=30) (actual time=2.684..4.520 rows=120 loops=1)
  Hash Cond: (orders.customerid = customers.customerid)
  ->  Seq Scan on orders  (cost=0.00..220.00 rows=12000 width=30) (actual time=0.004..0.743 rows=12000 loops=1)
  ->  Hash  (cost=738.00..738.00 rows=187 width=4) (actual time=2.664..2.664 rows=187 loops=1)
        Buckets: 1024  Batches: 1  Memory Usage: 7kB
        ->  Seq Scan on customers  (cost=0.00..738.00 rows=187 width=4) (actual time=0.018..2.638 rows=187 loops=1)
              Filter: ((state)::text = 'MD'::text)
              Rows Removed by Filter: 19813

II

EXPLAIN ANALYZE SELECT * FROM orders o JOIN customers c ON o.customerid = c.customerid WHERE c.state = 'MD'

Hash Join  (cost=740.34..1006.46 rows=112 width=298) (actual time=2.831..4.762 rows=120 loops=1)
  Hash Cond: (o.customerid = c.customerid)
  ->  Seq Scan on orders o  (cost=0.00..220.00 rows=12000 width=30) (actual time=0.004..0.768 rows=12000 loops=1)
  ->  Hash  (cost=738.00..738.00 rows=187 width=268) (actual time=2.807..2.807 rows=187 loops=1)
        Buckets: 1024  Batches: 1  Memory Usage: 37kB
        ->  Seq Scan on customers c  (cost=0.00..738.00 rows=187 width=268) (actual time=0.018..2.777 rows=187 loops=1)
              Filter: ((state)::text = 'MD'::text)
              Rows Removed by Filter: 19813

알 수 있듯이 계획의 유일한 차이점은 첫 번째 경우에는 hastable이 소비 7kB하지만 두 번째 경우 37kB에는 노드가 Hash Semi Join이다 는 것 입니다.

그러나 해시 테이블 크기의 차이점을 이해하지 못합니다. Hash노드 완벽 동일한 사용 Seq Scan이를 구비 노드 Filter. 왜 차이점이 있습니까?


쿼리의 실제 출력을 보셨습니까? 또는을 사용하십시오 explain (analyze, verbose).
jjanes

답변:


5

첫 번째 쿼리에서는 customer_id 만 customers해시 테이블에 저장 하면됩니다. 세미 조인을 구현하는 데 필요한 유일한 데이터이기 때문입니다.

두 번째 쿼리에서는 *customer_id의 존재 여부를 테스트하기보다는 테이블에서 모든 열을 선택하고 (를 사용하여 ) 모든 열을 해시 테이블에 저장해야합니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.