我的编程空间,编程开发者的网络收藏夹
学习永远不晚

merge into 和 update 的效率对比

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

merge into 和 update 的效率对比

merge into 和 update 的效率对比

以前只考虑 merge into 只是在特定场合下方便才使用的,今天才发现,merge into 竟然会比 update 在更新数据时有这么大的改进。
其实呢,merge into部分的update和update也没啥不同的,不同的地方在于使用merge into后执行计划变了。
赶紧测试看看,但是看到下面的结果,我和我的小伙伴惊呆了~
测试数据:
create table test1 as select * from dba_objects where rownum<=10000;--10000条记录
create table test2 as select * from dba_objects;--13438条记录
更新相同的数据,看看下面merge into和update相比性能上有何改进。
测试1:update
SQL>  alter system flush shared_pool;
系统已更改。
SQL>  alter system flush buffer_cache;
系统已更改。
SQL> set linesize 400 pagesize 400
SQL> set autot trace
SQL> set timing on
SQL> update test1 t1
  2     set t1.object_name =
  3         (select t2.object_name
  4            from test2 t2
  5           where t2.object_id = t1.object_id);
已更新10000行。
已用时间:  00: 00: 25.24
执行计划
----------------------------------------------------------
Plan hash value: 3883393169
----------------------------------------------------------------------------
| Id  | Operation          | Name  | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------
|   0 | UPDATE STATEMENT   |       |  9606 |   741K|   518K  (2)| 01:43:46 |
|   1 |  UPDATE            | TEST1 |       |       |            |          |
|   2 |   TABLE ACCESS FULL| TEST1 |  9606 |   741K|    40   (0)| 00:00:01 |
|*  3 |   TABLE ACCESS FULL| TEST2 |   167 | 13193 |    53   (0)| 00:00:01 |
----------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   3 - filter("T2"."OBJECT_ID"=:B1)
Note
-----
   - dynamic sampling used for this statement (level=4)
统计信息
----------------------------------------------------------
        234  recursive calls
      10665  db block gets
   
        335  physical reads
    1631056  redo size
        685  bytes sent via SQL*Net to client
        705  bytes received via SQL*Net from client
          3  SQL*Net roundtrips to/from client
         17  sorts (memory)
          0  sorts (disk)
      10000  rows processed
测试2:merge into
SQL>  alter system flush shared_pool;
系统已更改。
已用时间:  00: 00: 00.33
SQL>  alter system flush buffer_cache;
系统已更改。
已用时间:  00: 00: 00.11
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_name = t2.object_name;
10000 行已合并。
已用时间:  00: 00: 01.14
执行计划
----------------------------------------------------------
Plan hash value: 818823782
--------------------------------------------------------------------------------------
| Id  | Operation            | Name  | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------
|   0 | MERGE STATEMENT      |       |  9607 |  1238K|       |   373   (1)| 00:00:05 |
|   1 |  MERGE               | TEST1 |       |       |       |            |          |
|   2 |   VIEW               |       |       |       |       |            |          |
|*  3 |    HASH JOIN         |       |  9607 |  3996K|  2168K|   373   (1)| 00:00:05 |
|   4 |     TABLE ACCESS FULL| TEST1 |  9606 |  2054K|       |    40   (0)| 00:00:01 |
|   5 |     TABLE ACCESS FULL| TEST2 | 16669 |  3369K|       |    53   (0)| 00:00:01 |
--------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   3 - access("T1"."OBJECT_ID"="T2"."OBJECT_ID")
Note
-----
   - dynamic sampling used for this statement (level=4)
统计信息
----------------------------------------------------------
        359  recursive calls
      10265  db block gets
       
        343  physical reads
    2725336  redo size
        685  bytes sent via SQL*Net to client
        698  bytes received via SQL*Net from client
          3  SQL*Net roundtrips to/from client
         23  sorts (memory)
          0  sorts (disk)
      10000  rows processed
具体看下面的结果:
SQL> set autot off
SQL> update test1 t1
  2     set t1.object_name =
  3         (select t2.object_name
  4            from test2 t2
  5           where t2.object_id = t1.object_id);
已更新10000行。
已用时间:  00: 00: 27.26
SQL> select * from table(dbms_xplan.display_cursor(null,null,'iostats'));
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------
SQL_ID  c0pc2fq4pj4zq, child number 0
-------------------------------------
update test1 t1    set t1.object_name =
  (select t2.object_name           from test2 t2          where
t2.object_id = t1.object_id)
Plan hash value: 3883393169
--------------------------------------------------------------------------------------
| Id  | Operation          | Name  | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
--------------------------------------------------------------------------------------
|   0 | UPDATE STATEMENT   |       |      1 |        |      0 |00:00:27.26 |    1800K|
|   1 |  UPDATE            | TEST1 |      1 |        |      0 |00:00:27.26 |    1800K|
|   2 |   TABLE ACCESS FULL| TEST1 |      1 |   9606 |  10000 |00:00:00.04 |     134 |
|*  3 |   TABLE ACCESS FULL| TEST2 |     167 |  10000 |00:00:27.03 |    1800K|
--------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   3 - filter("T2"."OBJECT_ID"=:B1)
Note
-----
   - dynamic sampling used for this statement (level=4)
已选择26行。
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_name = t2.object_name;
10000 行已合并。
已用时间:  00: 00: 00.25
SQL> select * from table(dbms_xplan.display_cursor(null,null,'iostats'));
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------
SQL_ID  cg8wb3hrjx2bd, child number 0
-------------------------------------
merge into test1 t1 using test2 t2 on
(t1.object_id = t2.object_id) when matched then   update set
t1.object_name = t2.object_name
Plan hash value: 818823782
-------------------------------------------------------------------------------------------------
| Id  | Operation            | Name  | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Reads  |
-------------------------------------------------------------------------------------------------
|   0 | MERGE STATEMENT      |       |      1 |        |      0 |00:00:00.22 |   10568 |      1 |
|   1 |  MERGE               | TEST1 |      1 |        |      0 |00:00:00.22 |   10568 |      1 |
|   2 |   VIEW               |       |      1 |        |  10000 |00:00:00.05 |     314 |      0 |
|*  3 |    HASH JOIN         |       |      1 |   9607 |  10000 |00:00:00.05 |     314 |      0 |
|   4 |     TABLE ACCESS FULL| TEST1 |      1 |   9606 |  10000 |00:00:00.01 |     134 |      0 |
|   5 |     TABLE ACCESS FULL| TEST2 |      1 |  16669 |  13438 |00:00:00.01 |     180 |      0 |
-------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   3 - access("T1"."OBJECT_ID"="T2"."OBJECT_ID")
Note
-----
   - dynamic sampling used for this statement (level=4)
已选择28行。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

merge into 和 update 的效率对比

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Pandas使用Merge与Join和Concat分别进行合并数据效率对比分析

这篇文章主要给大家介绍了关于pandas中DataFrame数据合并连接(merge、join、concat)的相关资料,文中介绍的非常详细,需要的朋友可以参考下
2022-12-08

Nginx HttpMemcModule和直接访问memcached效率对比测试

Nginx HttpMemcModule和直接访问memcached效率对比测试
2022-11-15

Python列表和集合效率源码对比分析

这篇“Python列表和集合效率源码对比分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python列表和集合效率源码对比
2023-07-06

Java中常见的IO读写效率对比

这篇文章主要介绍“Java中常见的IO读写效率对比”,在日常操作中,相信很多人在Java中常见的IO读写效率对比问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中常见的IO读写效率对比”的疑惑有所帮助!
2023-06-17

性能对比:Go语言与C语言的速度和效率

性能对比:Go语言与C语言的速度和效率在计算机编程领域,性能一直是开发者们关注的重要指标。在选择编程语言时,开发者通常会关注其速度和效率。Go语言和C语言作为两种流行的编程语言,被广泛用于系统级编程和高性能应用。本文将对比Go语言和C语言
性能对比:Go语言与C语言的速度和效率
2024-03-10

PHP 数组键和值互换:不同算法的效率对比

在 php 中,互换数组键和值的最佳算法是:array_flip():时间复杂度 o(n),空间复杂度 o(n)。foreach() 循环:适用于大数组,时间复杂度 o(n),空间复杂度 o(1)。array_combine():类似于 a
PHP 数组键和值互换:不同算法的效率对比
2024-05-04

如何进行Linux大文件重定向和管道的效率对比

这篇文章的内容主要围绕如何进行Linux大文件重定向和管道的效率对比进行讲述,文章内容清晰易懂,条理清晰,非常适合新手学习,值得大家去阅读。感兴趣的朋友可以跟随小编一起阅读吧。希望大家通过这篇文章有所收获!Linux入门# 命令1,管道导入
2023-06-28

Go语言与Java在开发效率方面的比较:优缺点对比

Go语言和Java在开发效率上的不同:优势与劣势概述Go语言和Java都是广受欢迎的编程语言,它们都有自己的优点和缺点。在开发效率方面,Go语言和Java也有着不同的表现。Go语言的优势简单易学:Go语言的语法简单易懂,学习曲线较低。
Go语言与Java在开发效率方面的比较:优缺点对比
2024-01-31

深入浅析ArrayList 和 LinkedList的执行效率比较

一、概念: 一般我们都知道ArrayList* 由一个数组后推得到的 List。作为一个常规用途的对象容器使用,用于替换原先的 Vector。允许我们快速访问元素,但在从列表中部插入和删除元素时,速度却嫌稍慢。一般只应该用ListIt
2023-05-31

Python与sed,grep文本查找效率对比的示例分析

小编给大家分享一下Python与sed,grep文本查找效率对比的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!测试文本:20w行,21M大 python
2023-06-13

编程热搜

目录