相关文章推荐
有腹肌的黄花菜  ·  Spring ...·  1 年前    · 
听话的乌冬面  ·  Neo4j cypher ...·  1 年前    · 
私奔的登山鞋  ·  Python ...·  1 年前    · 

1.表连接的定义:

例子1:有一个特别的舞会,男孩子集中在一个房间,女孩子集中在另外一个房间,舞池设置在两个房间中间.

开始跳舞时,从男孩子中选出一个à然后进入女孩子所在房间à选择出高度合适的女孩!这种方式成为àNESTED LOOPS JOIN(嵌套循环连接)

例子2:男孩子在房间里面先按身高进行排序à女孩子也在房间按照身高进行排序à男女双方按照排列好的顺序依次出来到舞池中间跳舞

这种方式称为àHASH连接(由PGA中的HASH_AREA_SIZE参数来控制)或者MERGE SORT JOIN(排序合并连接)(由PGA中的SORT_AREA_SIZE参数控制)

2.表连接的特点

(1)嵌套循环连接:驱动表返回多少条记录,被驱动表就反问多少次!

其中例子:

Select/*+ leading(t1) use_nl(t2)*/ from t1,t2 where t1.id = t2.id;

Use_nl表示强制使用嵌套循环连接的方式,leading(t1)表示强制先访问t1表,也就是t1表作为驱动表。

不会产生排序操作。支持所有的连接条件,没有任何限制。

嵌套循环连接适用场景:

A.两表关联返回的记录不多,最佳情况是驱动表结果集仅返回1条或者少量几条记录,而被驱动表仅匹配到1条或少量几条记录,这种情况即便T1表和T2表的记录奇大无比,也是非常迅速 ?????(不明白,不应该是遍历两个表吗??怎么会很快??)

B.遇到一些不等值查询导致哈希连接和排序合并连接被限制使用。

优化思路:

驱动表的限制条件所在列有索引,被驱动表的连接条件的列有索引。

例如:select * from t1,t2 where t1.id = t2.t1_id and t1.n = 19;

此时如果t1表在n字段(限制条件)有索引,t2表在t1_id字段(连接条件)有索引的话,会高效。

解释:驱动表的限制条件建了索引,会快速的返回1条或几条记录,然后再根据连接条件传递给被驱动表,而被驱动表此时在该字段建有索引就会快速的返回记录。

(2)HASH连接:在HASH连接中,驱动表和被驱动表都只会访问0次或者1次。

Select /*+ leading(t1) use_hash(t2)*/* from t1,t2 where t1.id=t2.id;

哈希连接并不排序,但是需要消耗内存用于建立HASH表。在获取字段中根据业务需求尽量少获取字段。

哈希连接不支持不等值连接<>,不支持>和不支持

A.在限制条件列如有适当的索引可以提升性能

B.增大HASH_AREA_SIZE,一般在内存自动管理中,增大PGA的大小即可。

(3)排序合并连接:和HASH连接一样,只访问0次或者1次。但是没有驱动和被驱动表的概念。

Select /*+ ordered use_merge(t2)*/* from t1,t2 where t1.id= t2.id;

排序合并连接需要排序,会消耗内存。在获取字段中根据业务需求尽量少获取字段。

排序合并连接不支持<>,like的连接条件。

嵌套循环连接和哈希连接有驱动顺序,驱动表的顺序不同将影响表连接的性能而排序合并连接没有驱动的概念无论哪张表在前都无妨。

在连接条件列建立索引,以消除一张表的排序,提升效率。(但是2张表同时建立索引也只会消除一个表的排序)

转载自:http://blog.itpub.net/25269462/viewspace-764243/

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

表连接三剑客(嵌套循环连接,哈希连接,排序合并连接)1.表连接的定义:例子1:有一个特别的舞会,男孩子集中在一个房间,女孩子集中在另外一个房间,舞池设置在两个房间中间.开始跳舞时,从男孩子中选出一个à然后进入女孩子所在房间à选择出高度合适的女孩!这种方式成为àNESTED LOOPS JOIN(嵌套循环连接)例子2:男孩子在房间里面先按身高进行排序à女孩子也在房间按照身高进行排序à男女双方按照排列...
SQL server 内部实现了三种类型的内 连接 运算,大多数人从来没有听说过这些 连接 类型,因为它们不是逻辑 连接 也很少被用于代码中。那么它们什么时候会被用到呢?答案是要依情况而定。这就意味着要依赖于记录集和索引。查询优化器总是智能的选择最优的物理 连接 类型。我们知道SQL优化器创建一个计划开销是基于查询开销的,并依据此来选择最佳 连接 类型。 那查询优化器究竟是怎样从内部选择 连接 类型的呢? SQLServer在内部为查询优化器对 连接 类型的选择实现了一些算法,让我们来看下面的一些练习示
将两个 排序 ,然后再进行join ①首先生产drving table【驱动 】需要的数据,然后对这些数据按照 连接 操作关联列进行 排序 ; ②然后生产probed table【被探查 】需要的数据,然后对这些数据按照与driving table对应的 连接 操作列进行 排序 ; ③最后两边已经 排序 的行被放在一起执行 合并 操作。 应用场景: ① 排序 是一个费时、费资源的操作,特别对于大 。所以SMJ通常不是一个特别有效的 连接 方法,但是如果driving
1. 嵌套循环 连接 (Nested Loops)适用范围两个 , 一个叫外部 , 一个叫内部 . 如果外部输入非常小,而内部输入非常大并且已预先建立索引,那么 嵌套循环 联接将特别有效率。 关于 连接 时哪个 为outer ,哪个为inner ,我发现sql server会自动给你安排,和你写的位置无关,它自动选择数据量小的 为outer , 数据量大的 为inner 。 2. 合并 联接(Merge)指两...
Oracle 连接 方式有以下三种: 嵌套循环 链接(Nested Loops Join) 哈希 链接(Hash Join) 排序 合并 (Merge Sort Join) 连接 涉及到两个 A和B,通俗的讲 嵌套循环 链接相当于遍历A中的每一条记录(满足A 条件),然后再在B 中遍历记录直至找到匹配的记录,等同于两层循环。而 哈希 链接和 排序 合并 ,可以看作是先各自处理自身的记录( 排序 或ha
一、创建两张实验用 :wireless_site.merchant和wireless_site.bb SQL&gt; select count(*) from wireless_site.merchant;   COUNT(*) ----------      14005 SQL&gt; SQL&gt; select count(*) from wireless_site.clickthr...
嵌套循环 连接 (Nested Loops Join)是一种两个 在做 连接 时依靠两层 嵌套循环 (分别为外层循环和内存循环)来得到 连接 结果集的 连接 方法。即外层循环对应的驱动结果集有多少条记录,遍历被驱动 的内层循环就要做多少次,这就是所谓的“ 嵌套循环 ”的含义。 对于 嵌套循环 连接 的优缺点及适用场景如下: a,如果驱动 所对应的驱动结果集的记录数较少,同时在被驱动 连接 列上又存在唯一性索引(或者在被驱动 连接 列上存在选择性好的非唯一性索引),那么此时使用 嵌套循环 连接 的执行效率就会非常高;但如果驱动 所对应的
作为众多菜鸟中的一员,虽然无数次的写SQL语句,但是从来只知道有 哈希 链接,但是从来没有使用过,链接只是使用无数老师和教科书教的: select a.id from a,b where a.id=b.id;          相信有很多人也是如此。 今天就如何使用这三种链接及链接原理和使用场合进行了学习。 一 嵌套循环 连接 : SQL:select a.ac_id from tes
本系列的开篇在提到使用Map-Reduce实现Join之前,先来看看目前在数据库中应用比较广泛和流行的集中Join算法。它们分别是 嵌套循环 Join(Nested Loops Join)、 排序 合并 Join(Sort-Merge Join)和 哈希 Join(Hash Join)。 [b]1. 嵌套循环 Join[/b] [code="java"] for R中的每一条记录r do for S...
今天我将介绍在SQLServer 中的三种 连接 操作符类型,分别是:循环 嵌套 哈希 匹配和 合并 连接 。主要对这三种 连接 的不同、复杂度用范例的形式一一介绍。   本文中使用了示例数据库AdventureWorks ,下面是下载地址:http://msftdbprodsamples.codeplex.com/releases/view/4004 简介:什么是 连接 操作符 连接 操作符是一种算...
哈希 排序 算法是一种在计算机科学中常用的 排序 方法。它通过使用 哈希 函数,将每个元素映射到一个数字,然后对这些数字进行 排序 。 以下是在C语言中如何实现 哈希 排序 算法的代码示例: #include <stdio.h> #include <stdlib.h> #define MAX_SIZE 100 int hash_key(int value) { return value % MAX_SIZE; void hash_sort(int arr[], int n) { int i, j, k, key, hash_table[MAX_SIZE]; // 初始化 哈希 for (i = 0; i < MAX_SIZE; i++) { hash_table[i] = -1; // 将数组中的每个元素映射到 哈希 中 for (i = 0; i < n; i++) { key = hash_key(arr[i]); while (hash_table[key] != -1) { key = (key + 1) % MAX_SIZE; hash_table[key] = arr[i]; // 输出 哈希 中的元素 for (i = 0, j = 0; i < MAX_SIZE; i++) { if (hash_table[i] != -1) { arr[j++] = hash_table[i]; int main() { int arr[] = {22, 34, 56, 12, 67, 43, 56, 89}; int n = sizeof(arr) / sizeof(arr[0]); hash_sort(arr, n); printf(" 排序 后的数组为:\n"); for (int i = 0; i < n; i++) { printf("%d ", arr[i]); printf("\n"); return 0; 这段代码使用了一个 哈希 函数 `hash_key` 将数组中的每个元素映射到 哈希 中,然后再对 哈希 中的元素按顺序输出,得到最终的 排序 结果。