开发者博客:www.developsearch.com
在数据库系统中执行一个查询SQL语句,如果这个查询只操作一张表,那么仅仅涉及到这个表及关联对象的访问。
访问方式通常是三种:全表扫描、全索引扫描和索引扫描。
如果这个查询操作两张及以上的表,那么需要操作的表之间的连接关系就变得至关重要。
数据库系统执行该SQL时,永远都是两个结果集关联。
例如,
操作三张表,那么就是其中两张表关联出一个结果集,和第三张表关联。
操作四张表,那么就是其中两张表关联出一个结果集,和第三张表关联出一个结果集,再和第四张表关联出最后的结果集。当然也可能是两两关联出两个结果集,再相互关联得到最后的结果集。
操作五张表,各个表之间的关联方式就更复杂了。
---------------------------------------------嵌套连接
嵌套循环,顾名思义就是将一个表为出发点,将该表全部记录逐条去遍历另外一张表的记录,符合条件的就是写入结果集。
基于嵌套连接的特点,我们可以想得到,它在两个关联表的数据量相差比较大时采用,但整体上数据量都不应该太大。
该关联方式适用于得到小数据量的查询操作。
例1:
使用leading与use_n1来强制使用嵌套循环连接
leading提示要求先访问表t1,也就是它指定了哪张表作为外部循环表使用
use_nl提示指定了具体使用哪种连接方法来将内部循环返回的数据(表t2)与表t1连接起来
有必要指出的是:use_nl提示并没有引用t1
SELECT /*+ leading(t1) use_nl(t2) full(t1) full(t2) */* FROM t1,t2 WHERE t1.id = t2.id AND t1.n = 19执行计划如下:
例2:
select a.*, b * from EMP a, DEPT b where a.DEPTNO = b.DEPTNO;
如使用emp表为出发点,将emp表的记录都查询出来为m条,再将这m条记录的字段deptno值,逐条和dept表的所有记录的deptno字段值匹配,假如dept表有n条记录。
匹配出来的记录符合条件就写入到结果集中。
那么这样关联操作过程中,操作的记录条数就是:先是emp表的m条,接着是dept表n条,但查了m遍,总的记录数就是m+m*n。
如使用dept表为出发点,去遍历emp表,那么总的记录数就是n+n*m。
出发点不同的连接方法,需要的成本就是不一样的。CBO会去最小的那个。
使用伪代码来表示一下嵌套循环连接
declare begin for outer_table in (select * from emp) loop for inner_table in (select * from dept where DEPTNO = outer_table.DEPTNO) loop dbms_output.put_line(inner_table.*, outer_table.*); end loop; end loop; end;
---------------------------------------------哈希连接
a) 这种方法是在Oracle7后来引入的,使用了比较先进的连接理论,一般来说,其效率应该好于其它2种连接,但是这种连接只能用在CBO优化器中,而且需要设置合适的hash_area_size参数,才能取得较好的性能。
b) 在2个较大的row source之间连接时会取得相对较好的效率,在一个row source较小时则能取得更好的效率。
c) 只能用于等值连接中
---------------------------------------------笛卡儿乘积
当两个row source做连接,但是它们之间没有关联条件时,就会在两个row source中做笛卡儿乘积,这通常由编写代码疏漏造成(即程序员忘了写关联条件)。笛卡尔乘积是一个表的每一行依次与另一个表中的所有行匹配。在特殊情况下我们可以使用笛卡儿乘积,如在星形连接中,除此之外,我们要尽量使用笛卡儿乘积,否则,自己想结果是什么吧!
注意在下面的语句中,在2个表之间没有连接。
- SQL> explain plan for
- select emp.deptno,dept,deptno
- from emp,dept
- Query Plan
- SLECT STATEMENT [CHOOSE] Cost=5
- MERGE JOIN CARTESIAN
- TABLE ACCESS FULL DEPT
- SORT JOIN
- TABLE ACCESS FULL EMP
CARTESIAN关键字指出了在2个表之间做笛卡尔乘积。假如表emp有n行,dept表有m行,笛卡尔乘积的结果就是得到n * m行结果。
相关推荐
哈希表--链表 哈希表--链表 哈希表--链表 哈希表--链表哈希表--链表 哈希表--链表哈希表--链表 哈希表--链表哈希表--链表 哈希表--链表哈希表--链表 哈希表--链表
NOI导刊--基础数据结构--哈希、并查集--江涛 内含----讲义,代码
行业分类-设备装置-多媒体指纹哈希矢量构建方法及其装置.zip
最新的pwdump8-8.2--获取Windows密码哈希,可以结合ophcrack使用(可以问我要最新的)
行业文档-设计装置-一种基于多视图哈希的图书推荐方法.zip
行业分类-物理装置-一种深度跨模态哈希检索方法、设备及介质
传统监督哈希方法将图像学习的手工特征或机器学习特征和二进制码的单独量化步骤分开,并未很好地控制量化误差,并且不能保证生成哈希码的平衡性。为了解决这个问题,提出了新的多尺度平衡深度哈希方法。该方法采用多...
通过采用Top-Down grid网格划分方法选择待匿名区域,提出了基于Top-Down grid的位置敏感哈希划分的k匿名隐私保护算法,不仅可以提高时间效率,而且与现实世界更相符;利用位置敏感哈希函数对所选位置点进行投影变换...
044.sql对象_表空间.mp4 045.sql对象_用户.mp4 046.sql对象_建表授权同义词.mp4 047.sql对象_序列.mp4 ...056.sql对象_表分区-哈希分区.mp4 057.sql对象_表分区-自动扩展分区.mp4 058.sql对象_表分区的优缺点.mp4
HMAC-SHA1 含密钥的安全哈希算法。为了更安全健壮,采用了密钥的安全哈希算法。
深度哈希在图像搜索领域取得了很好的应用,然而,先前的深度哈希方法存在语义信息未被充分利用的局限性。...该算法在三个图像检索数据库CIFAR-10、NUS-WIDE和SUN397中进行验证,其准确率优于其他监督哈希方法。
哈希表 一、实验目的 学会哈希函数的构造方法,处理冲突的机制以及哈希表的查找。 二、实验内容 说明以下概念 1、哈希函数 在一般情况下,需在关键字与记录在表中的存储位置之间建立一个函数关系,以 f(key) 作为...
避免 这个问题的一个方法就是使用一个哈希函数来约束簇块的数量。哈希函数将会给定一个数值用来限定簇块数量的预计范围,但它得到的值是相对等分布的。哈希函数中存在的一个问题就是函数值会打乱记录原本的顺序。你...
行业分类-设备装置-基于局部敏感哈希的大规模多媒体数据的高维索引方法
封装hashtable的两级hash表,两个键值索引和访问。适合存放稀疏数据,如稀疏矩阵,稀疏表等结构,由于提供key-value的索引遍历,数据稀疏的情况下,相比于传统矩阵遍历的速度更快。
行业分类-设备装置-基于列存储的多核并行哈希分区优化方法
Oracle有三种表连接技术,分别是嵌套连接、合并连接和哈希连接。以下就是对这三种表连接算法进行了详细的分析介绍,需要的朋友可以参考下
毕业论文:哈希函数的构造方法,仅供参考。毕业论文 哈希函数
GOSTR34.11-2012:RFC-6986加密哈希函数.zip