PostgreSQL的三种表连接方式简述

我们知道PostgreSQL有三种表连接方式,分别是嵌套循环连接(Nestloop join)、哈希连接(Hash join)、排序合并连接(merge join)。

这三种连接方式是如何工作的呢?如果你熟悉Oracle的话,应该会发现着三种连接方式与Oracle是一样的。

Nestloop join:

嵌套循环连接是两个表在做连接时最朴素的一种连接方式。在嵌套循环连接中,内表被外表驱动,外表返回的每一行都要在内表中检索并找到与它匹配的行,因此整个查询返回的结果集不能太大(>10000不合适),要把返回子集较小的表作为外表,而且在内表的连接字段上要有索引,否则会很慢。

执行过程:加入有两个表A、B,A小于B,则查询优化器会先从A表中取出一条数,然后到B中找到匹配的行并放入等待返回的结果集中,然后再从A中取出第二条记录,继续到B中匹配,如此循环直到找到所有匹配结果并返回。

Hash join:

优化器使用两个表中较小的表,并利用连接键在内存中建立散列表,然后扫描较大的表并探测散列表,找出与散列表匹配的行。

这种方式使用于较小的表可以完全放于内存中的情况,这样总成本就是访问两个表的成本之和。但是如果表很大不能完全放入内存,优化器会将它分割成若干不同的分区,把不能放入内存的部分写入磁盘的临时段,此时要有较大的临时段以便尽量提高I/O性能。

执行过程:有A、B两张表,A表小于B表,查询优化器会先将A表在内存中建立一张以散列形式存在的查询二叉树C,然后取出B中的第一条记录,从C中查找匹配的记录,如果有则放入等待返回的结果集中。然后从B中取出第二条记录,重复上述过程,直到B中没有记录。

Merge join:

排序合并连接中,首先会对进行连接的两张表进行排序操作,然后对排序后的结果集进行合并连接。

执行过程:优化器首先对表A、B进行排序操作,生成两张临时表C、D。然后对C、D进行合并连接。


通常情况下,散列连接的效果比合并连接要好,但如果源数据上有索引,或者结果已经排过序,在执行排序合并的时候就不需要排序了,这时合并连接的性能会优于散列连接。

参考:PostgreSQL修炼之道   唐城



你可能感兴趣的:(postgresql)