在 PostgreSQL 查询计划中,Materialize 和 Hash 有什么区别?
In a PostgreSQL query plan, what is the difference between Materialize and Hash?
这是 an example 使用 Materialize 的查询计划:
Nested Loop (cost=4.65..49.46 rows=33 width=488)
Join Filter: (t1.hundred < t2.hundred)
-> ... (outer)
-> Materialize (cost=0.29..8.51 rows=10 width=244)
-> ... (inner)
下面是一个使用哈希的查询计划示例:
Hash Join (cost=230.47..713.98 rows=101 width=488)
Hash Cond: (t2.unique2 = t1.unique2)
-> ... (outer)
-> Hash (cost=229.20..229.20 rows=101 width=244)
-> ... (inner)
在第二个示例中,内部查询的结果被加载到散列 table 中,对于每个外部行,散列连接将进行散列 table 查找。
在第一个示例中,内部的结果也加载到内存中(这就是 Materialize 的意思,不是吗?),对于每个外部行,嵌套循环Join 还必须查找具体化数据中的正确行。它使用什么样的数据结构? (显然不是散列table。)
在咨询 the source 之后,我发现 Materialize 基本上只是一个连续的行缓存(元组存储),它不断倒回并为每个外部行再次迭代。
这是 an example 使用 Materialize 的查询计划:
Nested Loop (cost=4.65..49.46 rows=33 width=488)
Join Filter: (t1.hundred < t2.hundred)
-> ... (outer)
-> Materialize (cost=0.29..8.51 rows=10 width=244)
-> ... (inner)
下面是一个使用哈希的查询计划示例:
Hash Join (cost=230.47..713.98 rows=101 width=488)
Hash Cond: (t2.unique2 = t1.unique2)
-> ... (outer)
-> Hash (cost=229.20..229.20 rows=101 width=244)
-> ... (inner)
在第二个示例中,内部查询的结果被加载到散列 table 中,对于每个外部行,散列连接将进行散列 table 查找。
在第一个示例中,内部的结果也加载到内存中(这就是 Materialize 的意思,不是吗?),对于每个外部行,嵌套循环Join 还必须查找具体化数据中的正确行。它使用什么样的数据结构? (显然不是散列table。)
在咨询 the source 之后,我发现 Materialize 基本上只是一个连续的行缓存(元组存储),它不断倒回并为每个外部行再次迭代。