有时候开发组有这么一个需求,一个表和它的备份表,把备份表中的某些字段替换到原表中,当数据量非常大的时候就很很慢,这个时候如果我们用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进行性能优化的更多相关文章

  1. Android性能优化:布局优化 详细解析(含<include>、<ViewStub>、<merge>讲解 )

    1. 影响的性能 布局性能的好坏 主要影响 :Android应用中的页面显示速度 2. 如何影响性能 布局影响Android性能的实质:页面的测量 & 绘制时间 1个页面通过递归 完成测量 & ...

  2. 【腾讯Bugly干货分享】跨平台 ListView 性能优化

    本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/FbiSLPxFdGqJ00WgpJ94yw 导语 精 ...

  3. MySQL性能优化总结

    一.MySQL的主要适用场景 1.Web网站系统 2.日志记录系统 3.数据仓库系统 4.嵌入式系统 二.MySQL架构图: 三.MySQL存储引擎概述 1)MyISAM存储引擎 MyISAM存储引擎 ...

  4. (转) Android开发性能优化简介

    作者:贺小令 随着技术的发展,智能手机硬件配置越来越高,可是它和现在的PC相比,其运算能力,续航能力,存储空间等都还是受到很大的限制,同时用户对手机的体验要求远远高于PC的桌面应用程序.以上理由,足以 ...

  5. 数据库访问性能优化 Oracle

    特别说明: 1.  本文只是面对数据库应用开发的程序员,不适合专业DBA,DBA在数据库性能优化方面需要了解更多的知识: 2.  本文许多示例及概念是基于Oracle数据库描述,对于其它关系型数据库也 ...

  6. Android应用性能优化(转)

    人类大脑与眼睛对一个画面的连贯性感知其实是有一个界限的,譬如我们看电影会觉得画面很自然连贯(帧率为24fps),用手机当然也需要感知屏幕操作的连贯性(尤其是动画过度),所以Android索性就把达到这 ...

  7. android 性能优化

    本章介绍android高级开发中,对于性能方面的处理.主要包括电量,视图,内存三个性能方面的知识点. 1.视图性能 (1)Overdraw简介 Overdraw就是过度绘制,是指在一帧的时间内(16. ...

  8. 转载:SqlServer数据库性能优化详解

    本文转载自:http://blog.csdn.net/andylaudotnet/article/details/1763573 性能调节的目的是通过将网络流通.磁盘 I/O 和 CPU 时间减到最小 ...

  9. 【转载】我眼中的Oracle性能优化

    我眼中的Oracle性能优化 大家对于一个业务系统的运行关心有如下几个方面:功能性.稳定性.效率.安全性.而一个系统的性能有包含了网络性能.应用性能.中间件性能.数据库性能等等. 今天从数据库性能的角 ...

随机推荐

  1. HBA简介及原理

    HBA,即主机总线适配器英文“Host Bus Adapter”缩写.是一个使计算机在服务器和存储装置间提供输入/输出(I/O)处理和物理连接的电路板和/或集成电路适配器. 简介 主机总线适配器(Ho ...

  2. php 求水仙花数优化

    水仙花数是指一个n位数(n>=3),它每一个位上数字的n次幂之和等于它本身,n为它的位数.(比如:1^3+5^3+3^3 = 153) 水仙花数又称阿姆斯特朗数. 三位的水仙花数有4个:153, ...

  3. 优化器的使用oracle ---explain plan

    如果要分析某条SQL的性能问题,通常我们要先看SQL的执行计划,看看SQL的每一步执行是否存在问题. 如果一条SQL平时执行的好好的,却有一天突然性能很差,如果排除了系统资源和阻塞的原因,那么基本可以 ...

  4. NSLog 输出文件名、方法名、行号

    项目中经常会需要根据日志输出来寻找源代码,通过以下方法可以让它自动输出文件名.方法.行号,非常方便. 找到项目的pch文件,添加以下内容即可: ...为三个英文句号(复制粘贴后可能会变化). /** ...

  5. selenium 学习笔记 ---新手学习记录(7) 问题总结(java)

    1.想要获取固定ul下所有li的个数  如下图: //获取ul下li的个数 List<WebElement> elements = driver.findElement(By.id(&qu ...

  6. PowerShell Remove all user defined variable in PowerShell

    When PS scripts executes, it is possibly create much user defined variables. So, sometimes these var ...

  7. python数据库连接

    现在装python基本都内置了sqlite连接,写成如下形式即可 from sqlite3 import dbapi2 as sqlite 如果需要insert或update东西,之后的cur必须co ...

  8. Qt 设置背景图片3种方法(QPalette可以做无数的事情,一旦控件指定了调色板,就要乖乖听它的话;QPainter当场绘制当然也没有问题,还有就是QSS)

    方法1. setStylSheet{"QDialog{background-image:url()"}}  //使用styleSheet 这种方法的好处是继承它的dialog都会自 ...

  9. java.lang.UnsupportedClassVersionError: Bad version number in .class file 解决方案

    在Myeclipse中运行小应用程序时出现如下异常的解决办法 java.lang.UnsupportedClassVersionError: Bad version number in .class ...

  10. JAVA GUI学习 - 总结

    一:项目 二:重要组件补充 三:组件高级操作