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。