散列联接和合并联接(尤其是在Oracle RDBMS中)之间的性能增益/损失是什么?

推荐答案

通过根据连接键对要连接的两个数据集进行排序,然后将它们合并在一起,可以执行"排序-合并"连接.合并非常便宜,但排序可能会非常昂贵,尤其是排序溢出到磁盘时.如果可以通过索引按排序顺序访问其中一个数据集,则可以降低排序成本,尽管与全表扫描相比,通过索引扫描访问高比例的表块也可能非常昂贵.

散列连接是通过基于连接列将一个数据集散列到内存中,读取另一个数据集,并探测散列表中的匹配项来执行的.当哈希表可以完全保存在内存中时,哈希连接的成本非常低,总成本仅比读取数据集的成本高出一点点.如果哈希表必须在一次通过排序时溢出到磁盘,那么成本会增加,而在多次通过排序时,成本会大幅增加.

(在10g之前的版本中,从大表到小表的外部联接在性能方面存在问题,因为优化人员无法解决先访问较小表进行哈希联接,但先访问较大表进行外部联接的问题.因此,在这种情况下,哈希联接不可用).

通过在连接键上对两个表进行分区,可以降低哈希连接的成本.这使得优化程序可以推断,一个表中某个分区的行只会在另一个表的特定分区中找到匹配项,对于具有n个分区的表,哈希联接作为n个独立的哈希联接执行.这有以下影响:

  1. 每个哈希表的大小都减小了,因此减少了所需的最大内存量,并可能消除了操作需要临时磁盘空间的需要.
  2. 对于并行查询操作,进程间消息传递的数量大大减少,从而减少CPU使用并提高性能,因 for each 哈希连接都可以由一对PQ进程执行.
  3. 对于非并行查询操作,内存需求减少了n倍,第一行是从前面的查询中投影出来的.

您应该注意,哈希联接只能用于相等联接,但合并联接更灵活.

一般来说,如果要在等联接中联接大量数据,那么哈希联接将是更好的 Select .

这一主题在文档中有很好的介绍.

http://download.oracle.com/docs/cd/B28359_01/server.111/b28274/optimops.htm#i51523

12.1文件:https://docs.oracle.com/database/121/TGSQL/tgsql_join.htm

Sql相关问答推荐

如何在case语句中使用条件来计算成对变量

不可能在SQL MERGE子句中引发异常

LEFT JOIN不显示计数0我期望的方式

更新PostgreSQL 15中的JSON值

雅典娜嵌套Json提取液

SQL Select 最小优先级

冲突查询的UPDATE时违反非空约束

数组列的postgres更新查询

比较SQL中以逗号分隔的字符串

用VB.NET在Dapper中实现MS Access数据库顺序透视

如何在android房间中进行多个加入

不同计数的 Postgres PIVOT 表

MySQL中的递归查询邻接表深度优先?

确定小数中使用的精度位数

SQL:考虑合并分支计算分支的增长百分比

BigQuery数组是否包含NULL值的判断方法

如何根据共同列值从两个表中包含列,但只包含左表中的行

使用in和and运算符过滤记录的条件

Snowflake 中的对象是如何比较的?

SQL/Postgres:按日期和其他属性对相关性能进行分组