【书评:Oracle查询优化改写】第四章

BLOG文档结构图

一.1 导读

各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~:

① check的特殊用法

② sql优化中使用merge语句代替update语句(重点)

本文如有错误或不完善的地方请大家多多指正,ITPUB留言或QQ皆可,您的批评指正是我写作的最大动力。

一.2 实验环境介绍

目标库:11.2.0.3  RHEL6.5

一.3 前言

前3章的链接参考相关连接:

【书评:Oracle查询优化改写】第一章 http://blog.itpub.net/26736162/viewspace-1652985/

【书评:Oracle查询优化改写】第二章 http://blog.itpub.net/26736162/viewspace-1654252/

【书评:Oracle查询优化改写】第三章 http://blog.itpub.net/26736162/viewspace-1660422/

今天来写写这本书的第四章的内容,第四章主要讲了UPDATE语句的正确用法,以及什么时候UPDATE语句应改写为MERGE, 第四章的内容目录如下:

第 4 章 插入、更新与删除

4.1 插入新记录

4.2 阻止对某几列插入

4.3 复制表的定义及数据

4.4 用 WITH CHECK OPTION 限制数据录入

4.5 多表插入语句

4.6 用其他表中的值更新

4.7 合并记录

4.8 删除违反参照完整性的记录

4.9 删除名称重复的记录

一.4 check的特殊用法

我们知道sysdate不能用于check约束,但是有这种需求的时候怎么办呢?如下例子利用视图加with check option即可解决。

09:39:08 SQL> create table ttt(create_date  date  check(create_date > sysdate));

create table ttt(create_date  date  check(create_date > sysdate))

*

ERROR at line 1:

ORA-02436: date or system variable wrongly specified in CHECK constraint

09:41:56 SQL> insert into (select empno,ename,hiredate from scott.emp where hiredate <= sysdate with check option)

09:42:13   2  values ( 9999,'test',sysdate+1);

insert into (select empno,ename,hiredate from scott.emp where hiredate <= sysdate with check option)

*

ERROR at line 1:

ORA-01402: view WITH CHECK OPTION where-clause violation

Elapsed: 00:00:00.12

09:42:14 SQL> insert into (select empno,ename,hiredate from scott.emp where hiredate <= sysdate with check option)

09:42:56   2  values ( 9999,'test',sysdate-1);

1 row created.

Elapsed: 00:00:00.03

09:42:57 SQL>

一.5 merge语句

关于update的一个容易出错的地方就是不写where子句,这样的话会更新掉全表的数据,一个技巧就是把set中的值复制到where子句中即可。

另外,建议大家在做多表关联更新的时候修改为merge语句,因为merge into语句只访问了一次表:

[oracle@rhel6_lhr ~]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.3.0 Production on 星期二 5月 19 10:26:55 2015

Copyright (c) 1982, 2011, Oracle.  All rights reserved.

连接到:

Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production

With the Partitioning, Automatic Storage Management, OLAP, Data Mining

and Real Application Testing options

10:26:55 SQL> set autot on;

10:28:05 SQL> alter table lhr.emp_bk add dname varchar2(50) default 'noname';

表已更改。

已用时间:  00: 00: 01.23

10:30:04 SQL> update lhr.emp_bk a

10:30:09   2     set a.dname =(select b.dname from lhr.dept_bk b where b.deptno=a.deptno and b.dname in ('ACCOUNTING','RESERCH'))

10:30:09   3  WHERE EXISTS (select 1 from lhr.dept_bk b where b.deptno=a.deptno and b.dname in ('ACCOUNTING','RESERCH' ))

10:30:09   4  ;

已更新3行。

已用时间:  00: 00: 00.05

执行计划

----------------------------------------------------------

Plan hash value: 3525057516

-------------------------------------------------------------------------------

| Id  | Operation           | Name    | Rows  | Bytes | Cost (%CPU)| Time     |

-------------------------------------------------------------------------------

|   0 | UPDATE STATEMENT    |         |     4 |   544 |    28  (18)| 00:00:01 |

|   1 |  UPDATE             | EMP_BK  |       |       |            |          |

|*  2 |   HASH JOIN SEMI    |         |     4 |   544 |     8  (13)| 00:00:01 |

|   3 |    TABLE ACCESS FULL| EMP_BK  |    14 |  1596 |     3   (0)| 00:00:01 |

|*  4 |    TABLE ACCESS FULL| DEPT_BK |     1 |    22 |     4   (0)| 00:00:01 |

|*  5 |   TABLE ACCESS FULL | DEPT_BK |     1 |    22 |     4   (0)| 00:00:01 |

-------------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

2 - access("B"."DEPTNO"="A"."DEPTNO")

4 - filter("B"."DNAME"='ACCOUNTING' OR "B"."DNAME"='RESERCH')

5 - filter("B"."DEPTNO"=:B1 AND ("B"."DNAME"='ACCOUNTING' OR

"B"."DNAME"='RESERCH'))

Note

-----

- dynamic sampling used for this statement (level=2)

统计信息

----------------------------------------------------------

69  recursive calls

13  db block gets

121  consistent gets

9  physical reads

3012  redo size

837  bytes sent via SQL*Net to client

997  bytes received via SQL*Net from client

3  SQL*Net roundtrips to/from client

12  sorts (memory)

0  sorts (disk)

3  rows processed

已用时间:  00: 00: 00.00

10:33:13 SQL> merge into lhr.emp_bk a

10:33:32   2  using (select b.dname,deptno from lhr.dept_bk b where b.dname in ('ACCOUNTING','RESERCH')) bb

10:33:32   3  on (bb.deptno=a.deptno)

10:33:32   4  when matched then

10:33:32   5  update set a.dname =bb.dname

10:33:32   6  ;

3 行已合并。

已用时间:  00: 00: 00.03

执行计划

----------------------------------------------------------

Plan hash value: 1386289611

--------------------------------------------------------------------------------

| Id  | Operation            | Name    | Rows  | Bytes | Cost (%CPU)| Time     |

--------------------------------------------------------------------------------

|   0 | MERGE STATEMENT      |         |     4 |   492 |     8  (13)| 00:00:01 |

|   1 |  MERGE               | EMP_BK  |       |       |            |          |

|   2 |   VIEW               |         |       |       |            |          |

|*  3 |    HASH JOIN         |         |     4 |   592 |     8  (13)| 00:00:01 |

|*  4 |     TABLE ACCESS FULL| DEPT_BK |     1 |    22 |     4   (0)| 00:00:01 |

|   5 |     TABLE ACCESS FULL| EMP_BK  |    14 |  1764 |     3   (0)| 00:00:01 |

--------------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

3 - access("DEPTNO"="A"."DEPTNO")

4 - filter("B"."DNAME"='ACCOUNTING' OR "B"."DNAME"='RESERCH')

Note

-----

- dynamic sampling used for this statement (level=2)

统计信息

----------------------------------------------------------

20  recursive calls

7  db block gets

38  consistent gets

1  physical reads

1872  redo size

838  bytes sent via SQL*Net to client

942  bytes received via SQL*Net from client

3  SQL*Net roundtrips to/from client

3  sorts (memory)

0  sorts (disk)

3  rows processed

10:33:32 SQL>

另外几篇关于使用merge语句来优化的案例:

update修改为merge(max+decode) :http://blog.itpub.net/26736162/viewspace-1244055/

采用merge语句的非关联形式再次显神能 :http://blog.itpub.net/26736162/viewspace-1222423/

采用MERGE 语句的非关联形式提升性能 :http://blog.itpub.net/26736162/viewspace-1218671/

采用MERGE语句的非关联形式提升性能 ---后传 :http://blog.itpub.net/26736162/viewspace-1222417/

走了索引为啥还像蜗牛一样: http://blog.itpub.net/26736162/viewspace-1208814/

一.6 总结

到此SQL查询优化改写第四章基本over,重点是对merge语句的领悟和掌握,尤其是哥列出的几个案例,希望对做SQL优化的童鞋有所帮助。

一.7 about me

...........................................................................................................................................................................................

本文作者:小麦苗,只专注于数据库的技术,更注重技术的运用

ITPUB BLOG:http://blog.itpub.net/26736162

本文地址:http://blog.itpub.net/26736162/viewspace-1661906/

本文pdf版:http://yunpan.cn/QCwUAI9bn7g7w 提取码:af2d

QQ:642808185 若加QQ请注明你所正在读的文章标题

创作时间地点:2015-05-19 09:00~ 2015-05-19 11:20 于外汇交易中心

<版权所有,文章允许转载,但须以链接方式注明源地址,否则追究法律责任!>

...........................................................................................................................................................................................

【书评:Oracle查询优化改写】第四章的更多相关文章

  1. 【书评:Oracle查询优化改写】第二章

    [书评:Oracle查询优化改写]第二章 BLOG文档结构图 在上一篇中http://blog.itpub.net/26736162/viewspace-1652985/,我们主要分析了一些单表查询的 ...

  2. 【书评:Oracle查询优化改写】第14章 结尾章

    [书评:Oracle查询优化改写]第14章 结尾章 一.1  相关参考文章链接 前13章的链接参考相关连接: [书评:Oracle查询优化改写]第一章 http://blog.itpub.net/26 ...

  3. 【书评:Oracle查询优化改写】第五至十三章

    [书评:Oracle查询优化改写]第五至十三章 一.1  BLOG文档结构图 一.2  前言部分 一.2.1  导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知 ...

  4. 【书评:Oracle查询优化改写】第三章

    [书评:Oracle查询优化改写]第三章 BLOG文档结构图       导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① 隐含参数 ...

  5. oracle 查询优化改写

    -----------书籍: oracle 查询优化改写-----------第1个“C###oracle”为登录数据库的用户名,第2个“oracleChange”为登录数据库的密码“oracleCh ...

  6. 《Oracle查询优化改写技巧与案例》学习笔记-------使用数字篇

    一个系列的读书笔记,读的书是有教无类和落落两位老师编写的<Oracle查询优化改写技巧与案例>. 用这个系列的读书笔记来督促自己学习Oracle,同时,对于其中一些内容,希望大家看到以后, ...

  7. 《 Oracle查询优化改写 技巧与案例 》电子工业出版社

    第1章单表查询 11.1 查询表中所有的行与列 11.2 从表中检索部分行 21.3 查找空值 31.4 将空值转换为实际值 41.5 查找满足多个条件的行 51.6 从表中检索部分列 61.7 为列 ...

  8. Oracle查询优化改写--------------------高级查询

    一.给结果集分页 二.重新生成房间号 三.跳过表中n行 四.排列组合去重

  9. Oracle查询优化改写--------------------操作多个表

    一.union all与空字符串 二.组合相关行 三.in .exists.inter join .left join .right join .full join 之间的区别 'inner  joi ...

随机推荐

  1. electron---更改安装图标

    在用electron开发桌面端的时候,打包成exe文件,需要更改默认的图标: 具体做法: 在根目录新建新建存放icon图标的目录: 需要两个icon:icon.icns,icon.ico 注意: 1. ...

  2. 内存自动清理.sql

    --清除存储过程缓存 DBCC FREEPROCCACHE --注:方便记住关键字 FREEPROCCACHE可以拆解成 FREE(割舍,清除) PROC(存储过程关键字简写),CACHE(缓存) - ...

  3. Python3 打包exe

    cx_Freeze(不推荐) 以前只用 cx_Freeze 支持将 python3 打包成 exe ,示例如下: 在你要打包的 python 文件下新建这个 setup.py 文件: #!/usr/b ...

  4. 导出excel按照指定格式

    1.项目有个需求,要按照特定格式 导出Excel表格. 正常的都是一行 ,下面是数据.这次有个变动,就是每隔 几列要换行,下面是数据.在下面是数据部分.花了一上午写了下需求,不难但是花时间 //实现特 ...

  5. jsp标签${fn:contains()}遇到问题记录

    在jsp页面要实现这样一个功能,列表的某一列字段要显示的数据,是从后台的一个列表中获取的,数据库里面该列存储的方式是 类似 1,2,3 这样的 主键id数据.显示的时候要根据id显示名称,如果是多个 ...

  6. 转 java 8 lamba stream

    一直在写中间件相关的代码,提供SDK给业务方使用,但很多业务方还一直停留在1.7版本,迟迟不升级,为了兼容性,不敢在代码中使用Java8的一些新特性,比如Stream之类的,虽然不能用,但还是要学一下 ...

  7. 发布你自己的Nuget包

    ①安装NuGetPackageExplorer 来帮助我们发布你的包. ②https://www.nuget.org/ 创建你的apikey ③新建一个asp.net的空项目,并且安装nuget.se ...

  8. SpringBoot系列教程web篇之重定向

    原文地址: SpringBoot系列教程web篇之重定向 前面介绍了spring web篇数据返回的几种常用姿势,当我们在相应一个http请求时,除了直接返回数据之外,还有另一种常见的case -&g ...

  9. 构建C1000K的服务器(2) – 实现百万连接的comet服务器

    转自:http://www.ideawu.net/blog/archives/742.html 这是关于 C1000K 序列文章的第二篇, 在前一篇文章 构建C1000K的服务器(1) – 基础 中, ...

  10. [转帖]Shell运维手册

    shell实例手册    https://github.com/liquanzhou/ops_doc   0 说明{       手册制作: 雪松   更新日期: 2018-09-11       欢 ...