达梦中的连接查询方式,全部参照官方文档。
- 查询语句中FROM子句包含多个表时,称为连接查询。生成连接查询的执行计划,需要考虑三方面因素:访问路径、连接方式、连接顺序。
- 访问路径指对于每张表采用何种方式来获取数据,如全表扫描、索引扫描等。
- 连接方式是指确定两张表之间采用哪种连接方式,如哈希连接、嵌套连接、归并连接、外连接。等值连接条件一般会选择哈希连接;非等值连接条件会选择嵌套连接;连接列均为索引列时会采用归并连接。
- 嵌套连接(NEST LOOP JOIN):两张表进行非等值连接时会选择嵌套连接。相当于两张表进行笛卡尔积操作,此时优化器会选择一张代价较小的表作为外表(驱动表),另一张表作为内表,外表的每一条记录与内表进行一次连接操作;
- 哈希连接(HASH JOIN):两张表进行等值连接时会选择哈希连接。以一张表的连接列作为哈希键,构造哈希表,另一张表的连接列进行哈希探测,找到满足条件的记录。由于哈希命中率高,因此在大数据量的情况下,哈希连接的效率较高。哈希连接的代价是建立哈希表和哈希探测的代价;
- 归并连接:两张表的连接列均为索引列时,可以按照索引顺序进行归并,一趟归并就可以找出满足条件的记录。若查询列也属于索引列的子集,则归并连接只需扫描索引,会有更好的性能表现。在两表连接条件不是等值(如≥、≤、>、<)情况下时,归并排序连接很有用;
- 外连接:外连接分为左外连接、右外连接、全外连接。作为外表的数据会全部返回,若没有与外表匹配的记录,则填充NULL值。
- 子查询会转换成半连接,共有四种半连接方式:哈希半连接、索引半连接、归并半连接、嵌套半连接。等值连接会选择哈希/索引/归并半连接,非等值连接会选择嵌套半连接。
- 哈希半连接:以外表的连接列为KEY构造哈希表,内表的连接列进行探测来查找满足连接条件的记录;
- 索引半连接:若子查询的连接列为索引前导列,则可采用索引半连接。处理过程为外表的数据对子查询使用索引查找,返回满足条件的记录;
- 归并半连接:若相关子查询的连接条件均为索引列,则可采用索引半连接,按照索引顺序,对外表、内表进行同步扫描,返回满足条件的记录;
- 嵌套半连接:若连接条件为非等值,则可转换为嵌套半连接,处理过程为外表的每条记录去遍历内表,返回满足条件的记录。
- 当超过两张表进行连接时,就需要考虑表之间的连接顺序,不合适的连接顺序对执行效率有较大影响。一般原则是,经过连接可以产生较小结果集的表优先处理。
6042

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



