当前位置:  数据库>oracle

Oracle教程:select 操作产生的 redo

    来源: 互联网  发布时间:2017-04-07

    本文导语: 数据库版本: Oracle Database 10g Enterprise Edition Release 10.1.0.3.0 创建测试表:SQL> create table a  as select * from all_objects  ;Table created.SQL> set autotrace on statistics ;插入数据(hint append):SQL> insert /*+ append */ into a select * from ...

数据库版本:
Oracle Database 10g Enterprise Edition Release 10.1.0.3.0


创建测试表:
SQL> create table a  as select * from all_objects  ;
Table created.

SQL> set autotrace on statistics ;

插入数据(hint append):

SQL> insert /*+ append */ into a select * from all_objects ;
9891 rows created.

Statistics
----------------------------------------------------------
        302  recursive calls
        137  db block gets
       6040  consistent gets
          0  physical reads
    1055332  redo size
        627  bytes sent via SQL*Net to client
        558  bytes received via SQL*Net from client
          3  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
       9891  rows processed
SQL> commit ;
Commit complete.

第一次查询数据:
SQL> select count(*) from a ;
  COUNT(*)
----------
     19782

Statistics
----------------------------------------------------------
          0  recursive calls
          1  db block gets
        255  consistent gets
        248  physical reads
Oracle教程:select 操作产生的 redo[图片]  168  redo size    ---------------------------------> ???产生redo???
        395  bytes sent via SQL*Net to client
        507  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed


第二次查询:

SQL> select count(*) from a ;
  COUNT(*)
----------
     19782

Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
        252  consistent gets
          1  physical reads
Oracle教程:select 操作产生的 redo[图片]    0 redo size      
        395  bytes sent via SQL*Net to client
        507  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed


=================================================
如上所示,为什么在查询的时候会产生 redo ? 产生的redo 到底是做什么的?
=================================================
----











































































取消 hint append 插入数据,第一次查询不会产生redo


SQL> insert into a select * from a ;

19782 rows created.


Statistics
----------------------------------------------------------
        112  recursive calls
      21100  db block gets
        699  consistent gets
          0  physical reads
    7149196  redo size
        642  bytes sent via SQL*Net to client
        534  bytes received via SQL*Net from client
          3  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
      19782  rows processed

SQL>
SQL>
SQL> select count(*) from a ;

  COUNT(*)
----------
     39564


Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
        502  consistent gets
          0  physical reads
          0  redo sizeOracle教程:select 操作产生的 redo[图片]
        395  bytes sent via SQL*Net to client
        507  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed
---------------------------------------------------







































对表做了truncate 操作后,第一次查询也出现 redo

SQL> truncate table a ;

Table truncated.

SQL>
SQL> select count(*) from a;

  COUNT(*)
----------
         0


Statistics
----------------------------------------------------------
          1  recursive calls
          1  db block gets
          6  consistent gets
          0  physical reads
    Oracle教程:select 操作产生的 redo[图片]   96  redo size
        392  bytes sent via SQL*Net to client
        507  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

SQL>

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





























简单的说,在oracle的block上都有活动事务的标志的,如果一个事务commit后,由于某些block在commit之前已经写回datafile, 或者事务影响到的block数过多,则commi的时候只会清理undo segment header中的事务表信息,data block上的事务标志不会清除,否则代价过高。那么在一些读取这些block时,需要将这些事务标志进行清除,就是延迟块清除
-------------------------
这个在用append引语的时候才会产生select的redo日志,说明在提交前已经把数据块给写了,也进一步说明了直插的模式,就是不走缓存,直接写数据块和回滚快。满足延迟块清除的第一个条件,就是还没提交,数据已经写了。
---------------------------
====================================
在做个测试如下:
====================================

SQL> insert into a
  2  select * from a ;

129103 rows created.


Statistics
----------------------------------------------------------
        489  recursive calls
     137442  db block gets
       4058  consistent gets
       1516  physical reads
   46645744  redo size
        643  bytes sent via SQL*Net to client
        534  bytes received via SQL*Net from client
          3  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
     129103  rows processed

SQL> alter system checkpoint ;

System altered.

SQL>
SQL> select count(*) from a ;

  COUNT(*)
----------
    258206


Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
       3241  consistent gets
       2790  physical reads
          0  redo size
        395  bytes sent via SQL*Net to client
        507  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

SQL> commit ;

Commit complete.

SQL> select count(*) from a ;

  COUNT(*)
----------
    258206


Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
       4857  consistent gets
       2796  physical reads
     Oracle教程:select 操作产生的 redo[图片] 116484  redo size ------------------------------------> 第一次查询redo产生 (延迟块清除)
        395  bytes sent via SQL*Net to client
        507  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

SQL> select count(*) from a ;

  COUNT(*)
----------
    258206


Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
       3241  consistent gets
       2746  physical reads
          0  redo size        
       395  bytes sent via SQL*Net to client
        507  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

SQL>

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
































































































说白了就是数据块上的信息在前面还没来得及清理,select来帮它清理一下,既然select对数据块做了操作了,自然就要写redo了。

    
 
 

您可能感兴趣的文章:

  • Oracle 登录产生了01033错误
  • ORACLE日期相关操作
  • Linux下如何用C语言操作Oracle数据库相关的图书推荐
  • Oracle终于涉入支持Linux操作系统了
  • Linux平台下Oracle的操作
  • linux c 怎样利用pro*c/c++操作 win2000 下 oracle 谢谢
  • Window客户端通过ADO是否能够连接和操作Unix平台下的Oracle数据库?
  • Oracle将字符编码从GBK转到UTF8,如何操作比较稳妥?
  • 如何设定linux red hat 9的oracle9,让window的电脑可以操作数据库
  • linux oracle数据库删除操作指南
  • Linux环境中Oracle数据导入与导出备份操作
  • Oracle针对数据库某一行进行操作的时候,如何将这一行加行锁
  • oracle的plsql里有没有位操作的功能
  • fedora core5 (FC5) 下面不能装 Oracle 10g 么? (检查操作系统就通不过啊,晕)
  • Linux操作系统下Oracle数据库多实例启动方式及修改内存
  • 怎样在c语言的代码里内嵌的操作oracle数据库,各位大虾谢谢了
  • 一个关于JAVA操作oracle数据库时UPDATE权限的问题
  • Oracle中操作分页
  • Oracle 数据库操作技巧集
  • secureCRT远程连接服务器操作oracle数据库出现的问题
  • 请教各位:JAVA操作ORACLE的问题 急!!!
  • 学习登录oracle数据库时常用的操作命令
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Oracle相关基础知识教程集锦
  • Oracle新手教程 手工创建数据库的全部脚本及说明
  • oracle与mysql的视频教程下载地址分享
  • VMware中linux环境下oracle安装图文教程(二)ORACLE 10.2.05版本的升级补丁安装
  • Oracle教程:浅析监听器安装/配置入门
  • 求ferdora15 上安装oracle11G详细教程
  • redhat 4中安装Oracle 10g图文教程
  • 全套OCP视频(Oracle认证专家)教程之一
  • [Oracle新手教程] 用PL/SQL画直方图
  • 基于Linux平台的Oracle RAC 10g集群教程:删除节点所需要的步骤
  • Oracle 11g2的监听器配置教程
  • ORACLE 10g 安装教程[图文]
  • Oracle教程 误添加数据文件删除方法
  • Oracle 存储过程教程
  • 基于Linux平台的Oracle RAC 10g集群教程:添加节点所需要的步骤
  • [Oracle] Data Guard CPU/PSU补丁安装详细教程
  • VMware中linux环境下oracle安装图文教程(一)
  • DBA 在Linux下安装Oracle Database11g数据库图文教程
  • [Oracle] CPU/PSU补丁安装详细教程
  • Linux系统(X64)安装Oracle11g完整安装图文教程另附基本操作
  • Oracle 12c发布简单介绍及官方下载地址
  • 在linux下安装oracle,如何设置让oracle自动启动!也就是让oracle那个服务自动启动,不是手动的
  • oracle 11g最新版官方下载地址
  • 请问su oracle 和su - oracle有什么不同?
  • Oracle 数据库(oracle Database)Select 多表关联查询方式
  • 虚拟机装Oracle R12与Oracle10g
  • Oracle数据库(Oracle Database)体系结构及基本组成介绍
  • Oracle 数据库开发工具 Oracle SQL Developer
  • 如何设置让Oracle SQL Developer显示的时间包含时分秒
  • Oracle EBS R12 支持 Oracle Database 11g
  • Oracle 10g和Oracle 11g网格技术介绍


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3