`
rongxr
  • 浏览: 8805 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
社区版块
存档分类
最新评论

oracle 物理读 逻辑读的理解

阅读更多
       逻辑读是指从内存中读,物理读是指从磁盘上读取数据;如果内存中存在相应的读取数据,那么直接从内存中读取,逻辑读的次数加1,如果不存在,则从磁盘上读到内存中,再从内存中读取,逻辑度次数加1,物理读次数也加1。需要注意的是,物理读非常消耗系统资源,一个物理读需要消耗8ms,而一秒可以处理20万个逻辑读。

1.物理读(physical read)

当数据块第一次读取到,就会缓存到buffer cache 中,而第二次读取和修改该数据块时就在内存buffer cache 了 以下是例子:

1.1  第一次读取

C:\Documents and Settings\Paul Yi>sqlplus "/as sysdba"

SQL*Plus: Release 9.2.0.4.0 - Production on Thu Feb 28 09:32:04 2008

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.


Connected to:
Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.4.0 - Production

SQL> set autotrace traceonly
SQL> select * from test;


Execution Plan
----------------------------------------------------------
    0      SELECT STATEMENT ptimizer=CHOOSE (Cost=2 Card=4 Bytes=8)
    1    0   TABLE ACCESS (FULL) OF 'TEST' (Cost=2 Card=4 Bytes=8)




Statistics
----------------------------------------------------------
         175  recursive calls
           0   db block gets
          24  consistent gets
           9   physical reads             --9个物理读
          0   redo size
        373  bytes sent via SQL*Net to client
        503  bytes received via SQL*Net from client
          2   SQL*Net roundtrips to/from client
          2   sorts (memory)
          0   sorts (disk)
          1   rows processed

1.2  第二次读取

SQL> select * from test;


Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT ptimizer=CHOOSE (Cost=2 Card=4 Bytes=8)
   1    0   TABLE ACCESS (FULL) OF 'TEST' (Cost=2 Card=4 Bytes=8)




Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          7  consistent gets
          0  physical reads     --没有发生物理读了,直接从buffer cache 中读取了
          0  redo size
        373  bytes sent via SQL*Net to client
        503  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

1.3  数据块被重新读入buffer cache ,这种发生在如果有新的数据需要被读入Buffer Cache中,而Buffer Cache又没有足够的空闲空间,Oracle就根据LRU算法将LRU链表中LRU端的数据置换出去。当这些数据被再次访问到时,需要重新从磁盘读入。

SQL> alter session set events 'immediate trace name flush_cache';      --清空数据缓冲区

Session altered.

SQL> select * from test;


Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT ptimizer=CHOOSE (Cost=2 Card=4 Bytes=8)
   1    0   TABLE ACCESS (FULL) OF 'TEST' (Cost=2 Card=4 Bytes=8)




Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          7  consistent gets
          6  physical reads   --又重新发生了物理读
          0  redo size
        373  bytes sent via SQL*Net to client
        503  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

2.逻辑读(buffer read)

逻辑读指的就是从(或者视图从)Buffer Cache中读取数据块。按照访问数据块的模式不同,可以分为即时读(Current Read)和一致性读(Consistent Read)。注意:逻辑IO只有逻辑读,没有逻辑写。

    即时读

即时读即读取数据块当前的最新数据。任何时候在Buffer Cache中都只有一份当前数据块。即时读通常发生在对数据进行修改、删除操作时。这时,进程会给数据加上行级锁,并且标识数据为“脏”数据。

SQL> select * from test for update;


Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT ptimizer=CHOOSE (Cost=2 Card=4 Bytes=8)
   1    0   FOR UPDATE
   2    1     TABLE ACCESS (FULL) OF 'TEST' (Cost=2 Card=4 Bytes=8)




Statistics
----------------------------------------------------------
          0  recursive calls
         1  db block gets
         14  consistent gets
          0  physical reads
        252  redo size
        386  bytes sent via SQL*Net to client
        503  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是一个多用户系统。当一个会话开始读取数据还未结束读取之前,可能会有其他会话修改它将要读取的数据。如果会话读取到修改后的数据,就会造成数据的不一致。一致性读就是为了保证数据的一致性。在Buffer Cache中的数据块上都会有最后一次修改数据块时的SCN。如果一个事务需要修改数据块中数据,会先在回滚段中保存一份修改前数据和SCN的数据块,然后再更新Buffer Cache中的数据块的数据及其SCN,并标识其为“脏”数据。当其他进程读取数据块时,会先比较数据块上的SCN和自己的SCN。如果数据块上的SCN小于等于进程本身的SCN,则直接读取数据块上的数据;如果数据块上的SCN大于进程本身的SCN,则会从回滚段中找出修改前的数据块读取数据。通常,普通查询都是一致性读。

下面这个例子帮助大家理解一下一致性读:

会话1中:

SQL> select * from test;

        ID
        ----------
          1000

SQL> update test set id=2000;

1 row updated.

会话2中:

SQL> set autotrace on
   SQL> select * from test;

        ID
       ----------
          1000


Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT ptimizer=CHOOSE (Cost=2 Card=4 Bytes=8)
   1    0   TABLE ACCESS (FULL) OF 'TEST' (Cost=2 Card=4 Bytes=8)




Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          9  consistent gets    没有事务做update时是7个一致读,多了2个一致读,这2个是要从回滚段中获取的  
          0  physical reads
         52  redo size
        373  bytes sent via SQL*Net to client
        503  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

SQL>


3、其他
db block gets
Number of times a CURRENT block was requested.
请求的数据块在buffer能满足的个数

consistent gets
Number of times a consistent read was requested for a block.
数据请求在回滚段Buffer中的总数

physical reads
Total number of data blocks read from disk. This number equals the value of "physical reads direct" plus all reads into buffer cache.
所有从磁盘读取的数据块数量,即从磁盘读到Buffer cache数据块的数量加上直接物理读


物理读是由于在DB_BLOCK_BUFFER中没有找到需要的数据,需要进行缓冲区的数据置换,物理读操作是非常消耗系统资源的,应当尽量避免。

一致读是由于需要读取的数据已经被锁定或修改,需要从回滚段的缓冲区中读取,一致读保证了数据一致性,但是大量的一致读说明系统设计或内存配置出现了问题,也是需要特别注意的。

DB Block Gets是指用户请求而且又恰好在DB_BLOCK_BUFFER中的数据量,对于一个良好的系统,绝大部分都就应当是这种情况。

分享到:
评论

相关推荐

    Oracle查看逻辑读、物理读资源占用排行的SQL语句

    首先,我们来理解一下逻辑读和物理读的概念: 1. **逻辑读**:逻辑读是指当Oracle执行一个SQL语句时,从数据缓冲区(Buffer Cache)中读取数据块的操作。如果所需的数据块已经在内存中,那么这个操作就被称为逻辑读...

    oracle基本机构逻辑结构

    Oracle数据库是一种广泛使用的大型关系型数据库管理系统,其复杂的架构包括多个层次的逻辑和物理结构。在Oracle中,数据库是核心的存储单元,它是一个数据集合,通过特定的逻辑映射方式将数据分布在不同的文件上,...

    oracle9i物理结构,oracle9i物理结构

    Oracle 9i 物理结构是数据库管理系统的核心...理解Oracle 9i的物理结构对于数据库管理员来说至关重要,因为它直接影响到数据库的性能、可靠性和可维护性。正确管理和配置这些组件能确保数据库高效运行并提供数据保护。

    浅析Oracle数据库的逻辑备份与恢复.pdf

    首先,要理解Oracle数据库逻辑备份中的Export工具。Export工具可以将数据库中的数据导出到一个二进制文件中,这个文件被称为DMP文件。在内容部分提到了一些Export的关键参数,例如: - user:指定连接数据库使用的...

    Oracle数据库的逻辑结构与物理结构.pptx

    Oracle数据库的逻辑结构与物理结构是理解其工作原理的关键部分。在Oracle数据库中,数据的组织和存储方式既包括逻辑层面的抽象,也涉及到实际在硬盘上的物理布局。本章主要探讨了4个主题:Oracle数据库的逻辑结构、...

    Oracle的逻辑结构、物理结构与实例.docx

    ### Oracle的逻辑结构、物理结构与实例 #### 一、Oracle的逻辑结构 Oracle数据库的逻辑结构是一种层次化的组织方式,主要包括以下组成部分: 1. **数据块(Data Blocks)** - **定义**:数据块是Oracle数据库中...

    Oracle9i数据库逻辑结构

    本文将深入探讨Oracle9i数据库的逻辑结构,帮助读者更好地理解其内部机制,并为实际操作提供指导。 #### 二、Oracle9i数据库逻辑结构概述 Oracle9i的逻辑存储结构主要由表空间(Tablespaces)、段(Segments)、区...

    powerdesigner9.5物理模型和Oracle建模

    总而言之,通过掌握PowerDesigner9.5的物理模型功能,并结合对Oracle数据库的深入理解,IT专业人员可以有效地设计出满足性能需求、易于维护的数据库系统。这需要不断学习和实践,但借助上述文档和工具,这个过程将变...

    Oracle的概念和术语,基本知识,物理数据库结构,逻辑结构

    理解Oracle的物理和逻辑结构对于数据库管理员来说非常重要,因为它们直接影响到数据的存储、查询性能和故障恢复。在日常管理和维护中,合理规划表空间、调整段和区间大小、优化索引等都是提升数据库性能的关键。 综...

    oracle9i逻辑结构,oracle9i逻辑结构

    理解Oracle 9i的逻辑结构对于有效地管理和优化数据库性能至关重要。通过合理地划分表空间,配置数据文件和管理数据块,可以确保数据库的稳定性和高效性。同时,根据业务需求创建和调整回退表空间和临时表空间,可以...

    Oracle必杀技物理删除数据文件恢复

    总的来说,Oracle物理删除数据文件恢复是一项技术性强、要求高的任务,但通过理解数据库的工作原理、熟悉Oracle的恢复命令,以及具备良好的问题解决能力,你完全可以应对这类挑战。在实践中不断积累经验,你将成为一...

    Oracle的逻辑结构、物理结构与实例.doc

    Oracle数据库是世界上最流行的商业关系型数据库管理系统之一,其复杂性和高效性主要体现在其逻辑结构、物理结构和实例的巧妙设计上。本篇文章将深入探讨Oracle的这三个关键组成部分。 首先,Oracle的逻辑结构是用户...

    Oracle数据库逻辑增量备份之exp/imp

    逻辑备份不同于物理备份,它不涉及数据文件的复制,而是导出数据库对象的定义和数据到一个文件中,然后在需要时导入这些数据。 21、逻辑备份原理 逻辑备份通过创建数据库对象的元数据和数据的文本表示来工作。exp...

    chap7Oracle物理存储结构.pptx

    Oracle 数据库的物理存储结构是其核心组成部分,它涉及到数据在操作系统层面上的实际存储和管理。这一章主要探讨了如何规划和管理Oracle数据库的物理存储结构,以确保数据的安全性和高效性。 首先,理解Oracle...

    9-Oracle数据库逻辑结构.pptx

    综上所述,Oracle数据库的逻辑结构是一个精细设计的多层次体系,它将复杂的物理存储抽象成易于管理和优化的逻辑组件。理解这些逻辑结构及其相互关系对于数据库管理员来说至关重要,因为这直接影响到数据库的性能、...

Global site tag (gtag.js) - Google Analytics