在previous博客中,我们开始讨论有关PostgreSQL中的加入操作,JOIN算法对于有效合并许多表的数据至关重要。
在此博客中,我们将进一步发展并讨论合并加入和哈希加入,这是两个流行的加入算法。我们将进一步谈论他们的变化。
合并加入:
此联接算法适用于等电量和天然结合。它有效地利用了分类的想法来集成两个表的分类数据。让我们调查其运行时变化和序列。
运行时顺序:
内部和外表的总分类成本构成了合并加入的启动成本。 o(外部 * log2(outer) + inner * log2(inne))可用于表示它。每个表中的元素量,外部和内部,确定运行成本,即O(外部 +内)。
变化:
- 合并加入:这是最简单的合并类型。要根据提供的联接条件加入元组,它在两个排序的表上运行合并操作。
- 实现的合并加入:在这种情况下,内表是实现的,这增加了内表扫描的有效性。在内部表格进行分类和实现之后,进行合并连接操作。
- 变化:在PostgreSQL中加入的合并会根据可以扫描外表索引的其他变化,例如嵌套环连接。
哈希加入:
postgresql中用于天然联接的另一种加入方法和等电量称为哈希联接。为了有效合并两个表的数据,它使用了哈希表。让我们谈谈哈希加入及其执行的变化。
哈希加入执行:
根据表的大小,哈希连接的性能不同。如果内表的大小为25%或更少,则可以直接进行两阶段内存哈希的连接。如果没有,它使用偏斜技术的混合动力哈希。
-
内存哈希(
) 使用批量哈希表,此技术在work_mem上执行联接操作。该过程由两个阶段组成:构建阶段,在此阶段,将内表元组添加到批处理中,第二阶段是探针阶段,在此期间对每个外表元组进行比较,将其比较到批处理中的内部元组加入。 -
混合哈希与偏斜一起:
当内表的元组无法适合work_mem中的单个批处理时,PostgreSQL使用混合哈希与偏斜技术的使用。它包括一个偏斜的批处理,多个批次和临时批处理文件。在偏斜的批处理中,内部表格存储了,取决于联接条件,将与具有高频值的外表元组合并。
加入访问路径并加入节点:
PostgreSQL中的JOIN PATH结构用作联接访问途径的表示,并且JOIN节点使用这些结构有效地执行JOIN算法。它们是嵌套循环节点,MergeJoinNode和HashJoinNode。
注意:阅读previous博客将有助于更好地理解。
此博客是hironobu suzuki撰写的书籍The Internals of PostgreSQL的摘要。