用merge into进行性能优化
有时候开发组有这么一个需求,一个表和它的备份表,把备份表中的某些字段替换到原表中,当数据量非常大的时候就很很慢,这个时候如果我们用merge into往往会提高几倍的性能,下面我们来做个实验:
SQL> drop table test1 purge;
表已删除。
SQL> drop table test2 purge;
表已删除。
SQL> create table test1 as select * from dba_objects;
表已创建。
SQL> alter table test1 nologging;
表已更改。
SQL> begin
   2    for i in 1 .. 5 loop
   3      insert /*+append*/
   4      into test1
   5        select * from dba_objects;
   6      commit;
   7    end loop;
   8  end;
   9  /
PL/SQL 过程已成功完成。
 SQL> update test1 set object_id = rownum;
已更新303258行。
SQL> commit;
提交完成。
SQL> create table test2 as select * from test1;
表已创建。
SQL> select count(*) from test1;
COUNT(*)
 ----------
     303258
SQL> select count(*) from test2;
COUNT(*)
 ----------
     303258
SQL> create index ind_object_id1 on test1(object_id) nologging;
索引已创建。
SQL> create index ind_object_id2 on test2(object_id) nologging;
索引已创建。
SQL> exec dbms_stats.gather_table_stats(user,'test1');
PL/SQL 过程已成功完成。
SQL> exec dbms_stats.gather_table_stats(user,'test2');
PL/SQL 过程已成功完成。
SQL> set timing on
 SQL> set autotrace traceonly
 SQL> update test1 t1
   2     set t1.object_type = (select object_type
   3                             from test2 t2
   4                            where t1.object_id = t2.object_id);
已更新303258行。
已用时间: 00: 00: 13.07
执行计划
 ----------------------------------------------------------
 Plan hash value: 2560893763
-----------------------------------------------------------------------------------------------
 | Id  | Operation                    | Name           | Rows  | Bytes | Cost (%CPU)| Time     |
 -----------------------------------------------------------------------------------------------
 |   0 | UPDATE STATEMENT             |                |   303K|  4146K|   949   (2)| 00:00:12 |
 |   1 |  UPDATE                      | TEST1          |       |       |            |          |
 |   2 |   TABLE ACCESS FULL          | TEST1          |   303K|  4146K|   949   (2)| 00:00:12 |
 |   3 |   TABLE ACCESS BY INDEX ROWID| TEST2          |     1 |    14 |     4   (0)| 00:00:01 |
 |*  4 |    INDEX RANGE SCAN          | IND_OBJECT_ID2 |     1 |       |     3   (0)| 00:00:01 |
 -----------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
 ---------------------------------------------------
4 - access("T2"."OBJECT_ID"=:B1)
统计信息
 ----------------------------------------------------------
         330  recursive calls
      338515  db block gets
     1250542  consistent gets
           1  physical reads
   107333692  redo size
         673  bytes sent via SQL*Net to client
         701  bytes received via SQL*Net from client
           4  SQL*Net roundtrips to/from client
           1  sorts (memory)
           0  sorts (disk)
      303258  rows processed
SQL> commit;
提交完成。
已用时间:  00: 00: 00.00
 SQL> merge into test1 t1
   2  using test2 t2
   3  on  (t1.object_id = t2.object_id)
   4  when matched then
   5    update set t1.object_type = t2.object_type;
303258 行已合并。
已用时间: 00: 00: 03.87
执行计划
 ----------------------------------------------------------
 Plan hash value: 520388833
--------------------------------------------------------------------------------------
 | Id  | Operation            | Name  | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
 --------------------------------------------------------------------------------------
 |   0 | MERGE STATEMENT      |       |   303K|  5923K|       |  4947   (2)| 00:01:00 |
 |   1 |  MERGE               | TEST1 |       |       |       |            |          |
 |   2 |   VIEW               |       |       |       |       |            |          |
 |*  3 |    HASH JOIN         |       |   303K|    53M|    30M|  4947   (2)| 00:01:00 |
 |   4 |     TABLE ACCESS FULL| TEST2 |   303K|    26M|       |   957   (3)| 00:00:12 |
 |   5 |     TABLE ACCESS FULL| TEST1 |   303K|    26M|       |   957   (3)| 00:00:12 |
 --------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
 ---------------------------------------------------
3 - access("T1"."OBJECT_ID"="T2"."OBJECT_ID")
统计信息
 ----------------------------------------------------------
         378  recursive calls
      310584  db block gets
        8547  consistent gets
        3751  physical reads
    76712320  redo size
         678  bytes sent via SQL*Net to client
         671  bytes received via SQL*Net from client
           4  SQL*Net roundtrips to/from client
           1  sorts (memory)
           0  sorts (disk)
      303258  rows processed
SQL> commit;
提交完成。
用merge into进行性能优化的更多相关文章
- Android性能优化:布局优化 详细解析(含<include>、<ViewStub>、<merge>讲解 )
		1. 影响的性能 布局性能的好坏 主要影响 :Android应用中的页面显示速度 2. 如何影响性能 布局影响Android性能的实质:页面的测量 & 绘制时间 1个页面通过递归 完成测量 & ... 
- 【腾讯Bugly干货分享】跨平台 ListView 性能优化
		本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/FbiSLPxFdGqJ00WgpJ94yw 导语 精 ... 
- MySQL性能优化总结
		一.MySQL的主要适用场景 1.Web网站系统 2.日志记录系统 3.数据仓库系统 4.嵌入式系统 二.MySQL架构图: 三.MySQL存储引擎概述 1)MyISAM存储引擎 MyISAM存储引擎 ... 
- (转) Android开发性能优化简介
		作者:贺小令 随着技术的发展,智能手机硬件配置越来越高,可是它和现在的PC相比,其运算能力,续航能力,存储空间等都还是受到很大的限制,同时用户对手机的体验要求远远高于PC的桌面应用程序.以上理由,足以 ... 
- 数据库访问性能优化 Oracle
		特别说明: 1. 本文只是面对数据库应用开发的程序员,不适合专业DBA,DBA在数据库性能优化方面需要了解更多的知识: 2. 本文许多示例及概念是基于Oracle数据库描述,对于其它关系型数据库也 ... 
- Android应用性能优化(转)
		人类大脑与眼睛对一个画面的连贯性感知其实是有一个界限的,譬如我们看电影会觉得画面很自然连贯(帧率为24fps),用手机当然也需要感知屏幕操作的连贯性(尤其是动画过度),所以Android索性就把达到这 ... 
- android 性能优化
		本章介绍android高级开发中,对于性能方面的处理.主要包括电量,视图,内存三个性能方面的知识点. 1.视图性能 (1)Overdraw简介 Overdraw就是过度绘制,是指在一帧的时间内(16. ... 
- 转载:SqlServer数据库性能优化详解
		本文转载自:http://blog.csdn.net/andylaudotnet/article/details/1763573 性能调节的目的是通过将网络流通.磁盘 I/O 和 CPU 时间减到最小 ... 
- 【转载】我眼中的Oracle性能优化
		我眼中的Oracle性能优化 大家对于一个业务系统的运行关心有如下几个方面:功能性.稳定性.效率.安全性.而一个系统的性能有包含了网络性能.应用性能.中间件性能.数据库性能等等. 今天从数据库性能的角 ... 
随机推荐
- HBA简介及原理
			HBA,即主机总线适配器英文“Host Bus Adapter”缩写.是一个使计算机在服务器和存储装置间提供输入/输出(I/O)处理和物理连接的电路板和/或集成电路适配器. 简介 主机总线适配器(Ho ... 
- php 求水仙花数优化
			水仙花数是指一个n位数(n>=3),它每一个位上数字的n次幂之和等于它本身,n为它的位数.(比如:1^3+5^3+3^3 = 153) 水仙花数又称阿姆斯特朗数. 三位的水仙花数有4个:153, ... 
- 优化器的使用oracle ---explain plan
			如果要分析某条SQL的性能问题,通常我们要先看SQL的执行计划,看看SQL的每一步执行是否存在问题. 如果一条SQL平时执行的好好的,却有一天突然性能很差,如果排除了系统资源和阻塞的原因,那么基本可以 ... 
- NSLog 输出文件名、方法名、行号
			项目中经常会需要根据日志输出来寻找源代码,通过以下方法可以让它自动输出文件名.方法.行号,非常方便. 找到项目的pch文件,添加以下内容即可: ...为三个英文句号(复制粘贴后可能会变化). /** ... 
- selenium 学习笔记 ---新手学习记录(7) 问题总结(java)
			1.想要获取固定ul下所有li的个数 如下图: //获取ul下li的个数 List<WebElement> elements = driver.findElement(By.id(&qu ... 
- PowerShell Remove all user defined variable in PowerShell
			When PS scripts executes, it is possibly create much user defined variables. So, sometimes these var ... 
- python数据库连接
			现在装python基本都内置了sqlite连接,写成如下形式即可 from sqlite3 import dbapi2 as sqlite 如果需要insert或update东西,之后的cur必须co ... 
- Qt 设置背景图片3种方法(QPalette可以做无数的事情,一旦控件指定了调色板,就要乖乖听它的话;QPainter当场绘制当然也没有问题,还有就是QSS)
			方法1. setStylSheet{"QDialog{background-image:url()"}} //使用styleSheet 这种方法的好处是继承它的dialog都会自 ... 
- java.lang.UnsupportedClassVersionError: Bad version number in .class file 解决方案
			在Myeclipse中运行小应用程序时出现如下异常的解决办法 java.lang.UnsupportedClassVersionError: Bad version number in .class ... 
- JAVA GUI学习 - 总结
			一:项目 二:重要组件补充 三:组件高级操作 
