作者:瀚高PG实验室 (Highgo PG Lab)
连接规划
当查找空间很小时,计划器进行一次近似穷举搜索。
当查找空间过大时,计划器使用基因查询优化或者启发法来限制规划时间和内存用量。
连接策略
嵌套循环(Nested loop)
表中每一个记录被取出,产生一个与其他表的每一记录相比较的循环。如果有一次匹配,那么输出记录。
此时成本大体上和表大小的乘积成正比,如果两个表都很大,成本会很高,此策略的效果会很差。
SELECT * FROM foo, bar WHERE foo.x = bar.x
Nested Loop
Join Filter: (foo.x = bar.x)
-> Seq Scan on bar
-> Materialize
-> Seq Scan on foo
带有内部索引扫描的嵌套循环(Nested loop with inner index-scan)
SELECT * FROM foo, bar WHERE foo.x = bar.x
Nested Loop
-> Seq Scan on foo
-> Index Scan using bar_pkey on bar
Index Cond: (bar.x = foo.x)
速度相较嵌套索引有所改善,但还不是最佳方案。
合并连接(Merge join)
只处理等值连接。
用排序或索引扫描将两个表中数据排序,然后并行的扫描这两张表,匹配所有相等的值。
示例
SELECT * FROM foo, bar WHERE foo.x = bar.x
Merge Join
Merge Cond: (foo.x = bar.x)
-> Sort
Sort Key: foo.x
-> Seq Scan on foo
-> Materialize
-> Sort
Sort Key: bar.x
-> Seq Scan on bar
哈希连接(Hash join)
同样只处理等值连接。
内部表中的每一行用散列算法创建一个散列表。然后在外部表中的每一行也被散列化,再扫描一次哈希表来寻找匹配。
哈希连接非常迅速但要求有足够的内存去存储内部元组。
不保证保持输入时候的顺序。
示例
SELECT * FROM foo, bar WHERE foo.x = bar.x
Hash Join
Hash Cond: (foo.x = bar.x)
-> Seq Scan on foo
-> Hash
-> Seq Scan on bar
本文介绍了数据库查询优化中的连接策略,包括嵌套循环、带有内部索引扫描的嵌套循环、合并连接及哈希连接等方法,并通过示例展示了每种策略的工作原理。
1444

被折叠的 条评论
为什么被折叠?



