通过根据连接键对要连接的两个数据集进行排序,然后将它们合并在一起,可以执行"排序-合并"连接.合并非常便宜,但排序可能会非常昂贵,尤其是排序溢出到磁盘时.如果可以通过索引按排序顺序访问其中一个数据集,则可以降低排序成本,尽管与全表扫描相比,通过索引扫描访问高比例的表块也可能非常昂贵.
散列连接是通过基于连接列将一个数据集散列到内存中,读取另一个数据集,并探测散列表中的匹配项来执行的.当哈希表可以完全保存在内存中时,哈希连接的成本非常低,总成本仅比读取数据集的成本高出一点点.如果哈希表必须在一次通过排序时溢出到磁盘,那么成本会增加,而在多次通过排序时,成本会大幅增加.
(在10g之前的版本中,从大表到小表的外部联接在性能方面存在问题,因为优化人员无法解决先访问较小表进行哈希联接,但先访问较大表进行外部联接的问题.因此,在这种情况下,哈希联接不可用).
通过在连接键上对两个表进行分区,可以降低哈希连接的成本.这使得优化程序可以推断,一个表中某个分区的行只会在另一个表的特定分区中找到匹配项,对于具有n个分区的表,哈希联接作为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