oracle表连接的优化
多表连接的三种方式: HASH JOIN,MERGE JOIN,NESTED LOOP
NESTED LOOP: 嵌套循环连接,适用于内表数据量较小时。外表返回的每一行都要在内表中检索找到与它匹配的行,因此整个查询返回的结果集不能太大(大于1 万不适合),而且在内表的连接字段上最好建立索引。
HASH JOIN: 哈希/散列连接,适用于小表(驱动表)连大表,且较小的表完全可以放于内存中的情况。但是在表很大的情况下并不能完全放入内存,这时优化器会将它分割成若干不同的分区,不能放入内存的部分就把该分区写入磁盘的临时段,此时要有较大的临时段从而尽量提高I/O 的性能。
SORT MERGE JOIN: 排序合并连接,适用于没有索引且数据已经排序、不等价关联等情况。通常情况下散列连接的效果都比排序合并连接要好,然而如果行源已经被排过序,在执行排序合并连接时不需要再排序了,这时排序合并连接的性能会优于散列连接。
一、 大表关联的优化方法 -- hash分区
参考链接:20亿与20亿表关联优化方法(超级大表与超级大表join优化方法)
问题:两个20亿大表关联耗时一天一夜
执行的SQL: select * from t1,t2 where t1.object_id=t2.object_id;
关联慢的原因:单个进程的PGA装不下大表数据 --> 消耗大量临时表空间 --> 临时表来回读写
优化方法:
1)开并行,并行hash。 -- 不可行
2)利用MPP架构/HADOOP架构思想:数据分割。
数据分割方法:一个是分区;另外一个是分表。本文选用分区。
步骤:
1)创建表P1,P2。在T1的表结构基础上多加一个字段HASH_VALUE,而且依据HASH_VALUE进行LIST分区。同理,P2。
注意:工作中具体需要多少分区需自己判断,但P1和P2表的分区必须一模一样。
CREATE TABLE P1(
HASH_VALUE NUMBER,
OWNER VARCHAR2(30),
OBJECT_NAME VARCHAR2(128),
SUBOBJECT_NAME VARCHAR2(30),
OBJECT_ID NUMBER,
DATA_OBJECT_ID NUMBER,
OBJECT_TYPE VARCHAR2(19),
CREATED DATE,
LAST_DDL_TIME DATE,
TIMESTAMP VARCHAR2(19),
STATUS VARCHAR2(7),
TEMPORARY VARCHAR2(1),
GENERATED VARCHAR2(1),
SECONDARY VARCHAR2(1),
NAMESPACE NUMBER,
EDITION_NAME VARCHAR2(30)
)
PARTITION BY list(HASH_VALUE)
(
partition p0 values (0),
partition p1 values (1),
partition p2 values (2),
partition p3 values (3),
partition p4 values (4)
)
2)向P1,P2中插入数据。
oracle中的hash分区就是利用的ora_hash函数。
partition by hash(object_id) <=> ora_hash(object_id,4294967295)
ora_hash(列,hash桶) ,hash桶默认是4294967295,能够设置0到4294967295。
ora_hash(object_id,4) 会把object_id的值进行hash运算,然后放到 0,1,2,3,4 这些桶里面。
delete t1 where object_id is null;
commit; delete t2 where object_id is null;
commit; insert into p1
select ora_hash(object_id,4), a.* from t1 a; ---工作中用append parallel并行插入
commit; insert into p2
select ora_hash(object_id,4), a.* from t2 a; ---工作中用append parallel并行插入
commit;
3)执行表关联。
优化后执行时间大约1小时。可将该过程整理为存储过程。
select * from p1,p2 where p1.object_id=p2.object_id and p1.hash_value=0 and p2.hash_value=0;
select * from p1,p2 where p1.object_id=p2.object_id and p1.hash_value=1 and p2.hash_value=1;
select * from p1,p2 where p1.object_id=p2.object_id and p1.hash_value=2 and p2.hash_value=2;
select * from p1,p2 where p1.object_id=p2.object_id and p1.hash_value=3 and p2.hash_value=3;
select * from p1,p2 where p1.object_id=p2.object_id and p1.hash_value=4 and p2.hash_value=4;
二、小表与大表关联 -- hash join
参考链接:oracle表连接----->哈希连接(Hash Join)
1)执行hash join
select /*+ leading(t1) use_hash(t2)*/ * from t1,t2 where t1.id=t2.t1_id; --可连个表都建立hash, use_hash(t1 t2)
2)查看执行计划
如果条件成立,驱动表和被驱动表都只被访问1次(主要看 starts),否则访问0次。
哈希连接中驱动表的选择非常重要,性能(主要看 A-Time | Buffers | OMem | 1Mem | Used-Mem)差别也大。一般选用结果集较小的表(非数据量)为驱动表。
-- 查看执行代码的 sql_id
select sql_id, child_number, sql_text from v$sql where sql_text like '%use_hash(t2)%'; -- 查看指定 sql_id 的执行计划
select * from table(dbms_xplan.display_cursor('036fyatp73h9n',0,'allstats last'));
3)其他
hash join 不支持不等值连接。(执行计划走的是 NESTED LOOPS JOIN)
explain plan for select /*+ leading(t2) use_hash(t1)*/ * from t1,t2 where t1.id<>t2.t1_id and t1.num=20; select * from table(dbms_xplan.display);
参考链接:
https://zhidao.baidu.com/question/453003972.html
oracle表连接的优化的更多相关文章
- Oracle 表连接方式分析 .
		
一 引言 数据仓库技术是目前已知的比较成熟和被广泛采用的解决方案,用于整和电信运营企业内部所有分散的原始业务数据,并通过便捷有效的数据访问手段,可以支持企业内部不同部门,不同需求,不同层次的用户随时获 ...
 - oracle表连接------>排序合并连接(Merge Sort Join)
		
排序合并连接 (Sort Merge Join)是一种两个表在做连接时用排序操作(Sort)和合并操作(Merge)来得到连接结果集的连接方法. 对于排序合并连接的优缺点及适用场景例如以下: a,通常 ...
 - Oracle表连接
		
一个普通的语句select * from t1, t2 where t1.id = t2.id and t1.name = 'a'; 这个语句在什么情况下最高效? 表连接分类: 1. 嵌套循环连接(N ...
 - oracle 表连接 - hash join 哈希连接
		
一. hash 连接(哈希连接)原理 指的是两个表连接时, 先利用两表中记录较少的表在内存中建立 hash 表, 然后扫描记录较多的表并探測 hash 表, 找出与 hash 表相匹配的行来得到结果集 ...
 - Oracle表连接(转)
		
表之间的连接 Join是一种试图将两个表结合在一起的谓词,一次只能连接2个表,表连接也可以被称为表关联.在后面的叙述中,我们将会使用”row source”来代替”表”,因为使用row source更 ...
 - oracle 表连接 - sort merge joins 排序合并连接
		
https://blog.csdn.net/dataminer_2007/article/details/41907581一. sort merge joins连接(排序合并连接) 原理 指的是两个表 ...
 - oracle 表连接 - nested loop 嵌套循环连接
		
一. nested loop 原理 nested loop 连接(循环嵌套连接)指的是两个表连接时, 通过两层嵌套循环来进行依次的匹配, 最后得到返回结果集的表连接方法. 假如下面的 sql 语句中表 ...
 - Oracle 表连接
		
Oracle 表之间的连接分为三种: 1. 内连接(自然连接) 2. 外连接 (1)左外连接 (左边的表不加限制) (2)右外连接(右边的表不加限制) (3)全外连接(左右两表都不 ...
 - ORACLE 表连接详解
		
在ORACLE中,表连接方式主要有:内连接,外连接,自连接: 内连接: 这是最常用的连接查询 SELECT * FROM A INNER JOIN B ON A.ID=B.ID SELECT * FR ...
 
随机推荐
- Docker容器数据卷介绍和命令
			
是什么 一句话:有点类似我们Redis里面的rdb和aof文件 先来看看Docker的理念: * 将运用与运行的环境打包形成容器运行 ,运行可以伴随着容器,但是我们对数据的要求希望是持久化的 * ...
 - jira问题更改项目
			
1.点击“问题”在问题中,筛选你要修改的问题,以下是以创建用户为搜索条件,然后点击“工具”---移动所有问题 2.选择要移动的问题,选择项目,进行移动
 - Vue全局过滤器的使用  运用在时间过滤  内容添加crud
			
过滤器的使用 msgFormt是你自己定义的过滤器方法, Vue.filter是你自己定义的全局过滤器.没有s 过滤器要有返回值哈 用retuen Vue.filter("msgFo ...
 - 201871010116-祁英红《面向对象程序设计(java)》第十三周学习总结
			
博文正文开头格式:(2分) 项目 内容 <面向对象程序设计(java)> https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://ww ...
 - (day59)十一、CSRF、Auth模块、impotlib模块、settings源码
			
目录 一.模拟实现中间件的编程思想 (一)impotlib模块 (二)实现功能的配置使用 二.跨站请求伪造CSRF (一)由来 (二)form表单的CSRF (三)ajax中的CSRF (1)通过da ...
 - Windows下同时安装python2和python3如何兼容版本
			
引言:因学习需要把python2和python3都安装了,为了避免使用过程中混淆版本在网上找了一些解决方案,亲测可用.方法如下: 分别下载并安装Python2.x和Python3.x. 配置环境变量. ...
 - CSP-S 2019文澜中学游记(11.15~11.17)
			
前言 今年的\(CSP-S\),本以为自己的实力与去年的\(NOIP\)相比,能有较大的提升的. 没想到,菜是原罪,弱就是弱,依然逃脱不了被吊锤的命运. \(Nov\ 15th\):\(Day\ 0\ ...
 - C#上手练习7(方法语句2)
			
上一篇方法调用赋值封装,这里使用封装后调用,尽量满足开闭原则. 以及静态类的使用. using System; namespace KingTest03 { class Program { int a ...
 - StreamWriter StreamReader
			
private void WriteLoginJsonData(object jsonData) { using (FileStream writerFileStream = new FileStre ...
 - Python制作动态二维码只需要一行代码!炒鸡简单!
			
分享一个比较有意思的项目,只需要一行Python代码就可以快捷方便生成普通二维码.艺术二维码(黑白/彩色)和动态GIF二维码. 用法比较简单,直接通过pip安装即可. pip3 install myq ...