Hash

名称

哈希算子

介绍

Hash和 Hash Join 一起使用,Hash算子为内表数据的连接列创建临时的哈希索引,使外表能够在内表上进行哈希探测。

通过执行 EXPLAIN ANALYZE 命令,可显示Hash算子的估算信息和实际执行信息,同时也显示所用哈希表的统计信息。哈希表统计信息包含初始状态下的Batches和Buckets数量, 最终状态下的Batches和Buckets数量,以及其生命周期内的内存峰值。这些信息有助于更好地了解哈希表的状态和性能,以便进行有效的优化。

举例

--清理环境
DROP TABLE t1 CASCADE;
DROP TABLE t2 CASCADE;

--创建环境
set SORT_MEM = 64;

CREATE TABLE t1(a int);
BEGIN
        FOR i IN 1..3001 LOOP
                INSERT INTO t1 VALUES(18320);
        END LOOP;
END;
/
ANALYZE t1;

CREATE TABLE t2(b int);
BEGIN
        FOR i IN 1..3001 LOOP
                INSERT INTO t2 VALUES(18320);
        END LOOP;
END;
/
ANALYZE t2;

EXPLAIN ANALYZE SELECT * FROM t1, t2 WHERE a = b;
                                                        QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------
 Hash Join(Inner Join)  (cost=148.76..298087.11 rows=26471025 width=8) (actual time=12.13..2385.35 rows=9006001 loops=1)
   Hash Cond: ("outer".A = "inner".B)
   ->  Seq Scan on T1  (cost=0.00..63.45 rows=5145 width=4) (actual time=0.02..1.52 rows=3001 loops=1)
   ->  Hash  (cost=63.45..63.45 rows=5145 width=4) (actual time=4.34..4.34 rows=0 loops=1)
         Buckets: 1033 (originally 1033)  Batches: 16 (originally 8)  Memory Usage: 64kB
         ->  Seq Scan on T2  (cost=0.00..63.45 rows=5145 width=4) (actual time=0.01..1.58 rows=3001 loops=1)
 Planning Time: 0.43 msec
 Execution Time: 3361.29 msec
(8 rows)
  • Inner Join 算子属性,表示连接类型
  • Hash Cond 限定条件

查看上述计划,可以确切得知Hash算子使用的哈希表初始状态下拥有1033个Buckets和8个Batches。而在最终状态下,Buckets数量保持不变,但Batches数量增加至16个。 此外,该哈希表在其生命周期内所使用的内存峰值达到了64kB。