(一)、物理读:把数据从数据块读取到buffer cache中

1、第一次查询一个表t
select * from t ;
2、第二次查询:
select * from t;

第一次查询有6次物理读,第二次查询有0个物理读。
当数据块第一次读取到,就会缓存到buffer cache 中,而第二次读取和修改该数据块时就在内存buffer cache 了。
3、数据块被重新读入buffer cache ,
这种发生在如果有新的数据需要被读入Buffer Cache中,而Buffer Cache又没有足够的空闲空间,Oracle就根据LRU算法将LRU链表中LRU端的数据置换出去。当这些数据被再次访问到时,需要重新从磁盘读入。
下面来实验:
清空缓冲区:alter session set events 'immediate trace name flush_cache';
再来查询t表:又重新进行了6次物理读。

(二)、逻辑读:指从Buffer Cache中读取数据块
        1、及时读:即时读即读取数据块当前的最新数据。任何时候在Buffer Cache中都只有一份当前数据块。即时读通常发生在对数据进行修改、删除操作时。这时,进程会给数据加上行级锁,并且标识数据为“脏”数据。
        2、数据一致性读:Oracle是一个多用户系统。当一个会话开始读取数据还未结束读取之前,可能会有其他会话修改它将要读取的数据。如果会话读取到修改后的数据,就会造成数据的不一致。一致性读就是为了保证数据的一致性。在Buffer Cache中的数据块上都会有最后一次修改数据块时的SCN。如果一个事务需要修改数据块中数据,会先在回滚段中保存一份修改前数据和SCN的数据块,然后再更新Buffer Cache中的数据块的数据及其SCN,并标识其为“脏”数据。当其他进程读取数据块时,会先比较数据块上的SCN和自己的SCN。如果数据块上的SCN小于等于进程本身的SCN,则直接读取数据块上的数据;如果数据块上的SCN大于进程本身的SCN,则会从回滚段中找出修改前的数据块读取数据。通常,普通查询都是一致性读。
总结逻辑读:
Oracle性能调优中,逻辑读是个很重要的度量值,它不仅容易收集,而且能够告诉我们许多关于数据库引擎工作量的信息。逻辑读是在执行SQL语句的时候从高速缓存中读取的块数。

逻辑读在Oracle调优中有四个好处:

(1)逻辑读是受制于CPU能力的操作,因而,很好的反映了CPU的使用情况。

(2)逻辑读可能导致物理读,因而,通过减少逻辑读的数量,很可能会降低I/O操作次数。

(3)逻辑读是受制于串行的操作,既然经常要考虑多用户负载的优化,最小化逻辑读将有利于避免扩展性问题。

(4)逻辑读的数量可以通过SQL跟踪文件和动态性能视图在SQL语句以及执行计划级别获得。
     我们都知道,数据块是oracle最基本的读写单位,但用户所需要的数据,并不是整个块,而是块中的行,或列.当用户发出SQL语句时,此语句被解析执行完毕,就开始了数据的抓取阶段,在此阶段,服务器进程会先将行所在的数据块从数据文件中读入buffer cache,这个过程叫做物理读.物理读,每读取一个块,就算一次物理读.当块被送进buffer cache后,并不能立即将块传给用户,因为用户所需要的并不是整个块,而是块中的行.从buffer cache的块中读取行的过程,就是逻辑读.为了完成一次逻辑读,服务器进程先要在hash表中查找块所在的buffer cache  链.找到之后,需要在这个链上加一个cache buffer chains 闩,加闩成功之后,就在这个链中寻找指定的块,并在块上加一个pin锁.并释放cache buffer chains闩.然后就可以访问块中的行了.服务器进程不会将块中所有满足条件的行一次取出,而是根据你的抓取命令,每次取一定数量的行.这些行取出之后,会经由PGA传给客户端用户.行一旦从buffer cache中取出,会话要释放掉在块上所加的PIN.本次逻辑读就算结束.如果还要再抓取块中剩余的行,服务器进程要再次申请获得cache bufffer链闩.再次在块上加PIN.这就算是另外一次逻辑读咯.也就是说,服务器进程每申请一次cache buffer链闩,就是一次逻辑读.而每次逻辑读所读取的行的数量,可以在抓取命令中进行设置.
     逻辑读和Cache buffer chains闩关系密切,TOM曾有文章提到,进程每申请一次Cache buffer chains闩,就是一次逻辑读。但是,逻辑读并不等同于Cache buffer chains闩,每次逻辑读,在9i中至少需要获得两Cache buffer chains闩。逻辑读是指在Hash表中定位块的这个过程。

查询表块的分布:
select bk,max(id),min(id) from (select dbms_rowid.rowid_block_number(rowid) bk,id from temp) group by bk ;

----------------------------分隔线-----------------------------------------------------

物理读(Physical Reads)

从磁盘读取数据块到内存的操作叫物理读,当SGA里的高速缓存(Cache Buffer)里面不存在这些数据块时,就会产生物理读,另外。像全表扫描、磁盘排序等操作也可能产生物理读,原因也是因为ORACLE数据库需要访问的数据块较多,而有些数据块不在内存当中,需要从磁盘读取。

逻辑读(Logical Reads)

概念1:逻辑读指ORACLE从内存读到的数据块数量。一般来说, logical reads = db block gets + consistent gets

概念2:逻辑读指的就是从Buffer Cache中读取数据块。按照访问数据块的模式不同,可以分为当前模式读(Current Read)和一致性读(Consistent Read)。 

这两个概念本质是一样的,只是措辞不一样。

一致性读(Consistant Get)

ORACLE是一个多用户系统。当一个会话开始读取数据还未结束读取之前,可能会有其他会话修改了它将要读取的数据。如果会话读取到修改后的数据,就会造成数据的不一致。一致性读就是为了保证数据的一致性。在Buffer Cache中的数据块上都会有最后一次修改数据块时的SCN。如果一个事务需要修改数据块中数据,会先在回滚段中保存一份修改前数据和SCN的数据块,然后再更新Buffer Cache中的数据块的数据及其SCN,并标识其为“脏”数据。当其他进程读取数据块时,会先比较数据块上的SCN和进程自己的SCN。如果数据块上的SCN小于等于进程本身的SCN,则直接读取数据块上的数据;如果数据块上的SCN大于进程本身的SCN,则会从回滚段中找出修改前的数据块读取数据。通常,普通查询都是一致性读。

当前模式读(DB Block Gets)

个人觉得当前模式读(db block gets)是最难理解的一个概念,通常情况下db block gets 可以理解为是DML操作才会产生的.

当前模式读(db block gets)即读取数据块是当前的最新数据。任何时候在Buffer Cache中都只有一份当前数据块。当前读通常发生在对数据进行修改、删除操作时。这时,进程会给数据加上行级锁,并且标识数据为“脏”数据。current mode产生db block gets,一般在DML操作时产生,query mode产生consistent gets(一致性读),一般在查询时产生。他们两个总和一般称为逻辑读,logical read。

Reference

https://www.cnblogs.com/kerrycode/p/5940626.html

Oracle 中的各种读相关推荐

  1. 在Oracle中,什么是物理读和逻辑读?

    在Oracle中,什么是物理读和逻辑读? 当会话所需要的数据在内存的 Buffer Cache 中找不到,此时就要去磁盘上的数据文件中读取,这样就产生了物理读( Physical Reads ),即物 ...

  2. 用python从Oracle中读数据

    将数据导入Oracle,并用python获取Oracle数据 (新手上路,不对的地方请多包涵) 背景 最近在和导师做华南地区的气象预测项目.之前获取华南各个站点的实况数据都是从别人提取出来的Excel ...

  3. 从oracle中读取图片,Pb从oracle中读取和保存图片

    Pb从oracle中读取和保存图片 (2008-12-12 12:23:20) 转载 分类:编程 标签: it //保存图片 //选择文件 string pname, fname integer va ...

  4. 如何用Excel直接查询Oracle中的数据(转)

    将Oracle中查询的数据保存为Excel文件,通常使用的是PL/SQL Developer. 其实,Excel可直接写SQL语句查询Oracle中数据,在这里,用到ODBC驱动.详细步骤如下: 一. ...

  5. Oracle中的备份和恢复之前必须知道的

    1.Oracle数据库恢复机制 Oracle利用重做日志(redo log).撤销记录(undo records).控制文件(control files)和数据库备份实现数据库恢复. 1)重做日志 重 ...

  6. oracle逻辑结构包含,在Oracle中,逻辑结构由哪几个部分组成?

    ♣答案部分 Oracle中逻辑结构包括表空间(TABLESPACE).段(SEGMENT).区(EXTENT)和块(BLOCK).数据库由表空间构成,而表空间又是由段构成,而段又是由区构成,而区又是由 ...

  7. 在Oracle中如何让SELECT查询绕过UNDO

    是否有想过如何在Oracle中实现脏读(dirty read),在Oracle官方文档或者Asktom的时候显然会提到Oracle是不实现脏读的, 总是有undo来提供数据块的前镜像(before i ...

  8. date oracle 表中_从 MySQL 迁移数据到 Oracle 中的全过程

    一.前言 这里记录一次将MySQL数据库中的表数据迁移到Oracle数据库中的全过程 ,使用工具 Navicat,版本 12.0.11 操作环境及所用工具: mysql5.7 oracle18c wi ...

  9. 4.事务提交过程,事务基本概念,Oracle中的事务生命周期,保存点savepoint,数据库的隔离级别

     事务提交过程 事务 基本概念 概念:一个或者多个DML语言组成 特点:要么都成功,要么都失败 事务的隔离性:多个客户端同时操作数据库的时候,要隔离它们的操作, 否则出现:脏读  不可重复读  幻 ...

最新文章

  1. iOS 导航栏遮挡视图
  2. Apple Swift编程语言入门教程
  3. matlab中的scramble函数,matlab 中 hold on 和hold off的使用
  4. 利用指针编程实现:删除一个字符串中的所有空格 c语言,C语言必考100题解析汇报...
  5. 使用matlab画半透明椭圆
  6. scrollLeft. float
  7. 万字长文!剖析美团外卖持续交付的前世今生
  8. 有问题,上微信问答群!
  9. 算法知识点——(4)降维
  10. js调用html页面跳转,js实现页面跳转的方法
  11. suitecrm上传附件限制修改
  12. 第一次带项目遇到的坑
  13. Python爬虫 带你一键爬取LOL英雄皮肤壁纸
  14. OptaPlanner
  15. H5页面input输入框,在ios手机中被顶出页面解决方案
  16. 大数据高级开发工程师——Spark学习笔记(6)
  17. C++-win32-GetLastError的返回值的含义
  18. php 保留2位整数 补白,php图片处理类 缩放有补白效果
  19. 成都农商银行软件测试面试题,农商行历年笔试真题找不到?不慌!16家农商行笔试题库等你来刷!...
  20. 关于网站目录结构需要注意的地方

热门文章

  1. 树莓派强制更改root密码
  2. win10双显示屏,分屏显示内容
  3. Linux【问题记录 05】阿里云+腾讯云服务器挖矿木马 kthreaddk 处理记录+云服务器使用建议
  4. 游戏建模的常用的软件和建模师的日常是什么?
  5. Post接口测试示例
  6. Kindle下线在即 使用cpolar建立自己的电子书图书馆
  7. CorelDRAW X3 金箔织绣材质特效——金箔绣球(1)
  8. 自媒体平台有哪些?如何找到一个适合自己的自媒体平台?
  9. AtCoder Grand Contest 021完整题解
  10. Android 极光推送 自定义通知铃声