逻辑读是指从内存中读,物理读是指从磁盘上读取数据;如果内存中存在相应的读取数据,那么直接从内存中读取,逻辑读的次数加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中的数据量,对于一个良好的系统,绝大部分都就应当是这种情况。
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中的数据量,对于一个良好的系统,绝大部分都就应当是这种情况。
发表评论
-
【转】PLSQL批量Forall操作性能提升详解
2013-07-24 18:14 674通常在SQL语句中给PL/SQL变量赋值叫做绑定(Bindin ... -
piner整理的关于Oracle的 FAQ
2013-03-20 14:36 417http://www.itpub.net/thread-180 ... -
唯一索引的索引键不保存rowid
2013-03-19 16:01 921tom的oracle 9i&10g编程艺 ... -
tnsnames.ora设置怪问题
2012-11-05 11:50 697tnsnames.ora设置怪问题 刚搞定困扰3天的orac ... -
Oracle LOAD批量写入数据
2012-09-21 10:39 627生产线数据库只有查询权限,需要从生产线下50W数据导入研发线, ... -
超好用的plsql设置
2012-09-21 10:39 9501、格式化SQL语句 在使 ... -
第一次和第二次的执行计划为啥不一样
2012-09-21 10:39 717下面的sql执行了两次,发现两次的执行计划有不一致的地方。re ... -
oracle 10g如何关闭和打开自动收集统计信息
2012-09-20 10:41 690一、ORACLE10g自动收集统计信息--自动analyze ... -
什么是INDEX SKIP SCAN
2012-09-20 10:40 964在查看SQL的执行计划的时候,有时候会看到INDEX SKIP ... -
oracle版本说明及主要特性
2012-09-20 10:37 7591983年3月,oracle第3版,引入事务的概念, ... -
应遵循的PL/SQL编码规则
2012-09-20 10:36 642作者:Steven Feuerstein ...
相关推荐
首先,我们来理解一下逻辑读和物理读的概念: 1. **逻辑读**:逻辑读是指当Oracle执行一个SQL语句时,从数据缓冲区(Buffer Cache)中读取数据块的操作。如果所需的数据块已经在内存中,那么这个操作就被称为逻辑读...
Oracle数据库是一种广泛使用的大型关系型数据库管理系统,其复杂的架构包括多个层次的逻辑和物理结构。在Oracle中,数据库是核心的存储单元,它是一个数据集合,通过特定的逻辑映射方式将数据分布在不同的文件上,...
Oracle 9i 物理结构是数据库管理系统的核心...理解Oracle 9i的物理结构对于数据库管理员来说至关重要,因为它直接影响到数据库的性能、可靠性和可维护性。正确管理和配置这些组件能确保数据库高效运行并提供数据保护。
首先,要理解Oracle数据库逻辑备份中的Export工具。Export工具可以将数据库中的数据导出到一个二进制文件中,这个文件被称为DMP文件。在内容部分提到了一些Export的关键参数,例如: - user:指定连接数据库使用的...
Oracle数据库的逻辑结构与物理结构是理解其工作原理的关键部分。在Oracle数据库中,数据的组织和存储方式既包括逻辑层面的抽象,也涉及到实际在硬盘上的物理布局。本章主要探讨了4个主题:Oracle数据库的逻辑结构、...
### Oracle的逻辑结构、物理结构与实例 #### 一、Oracle的逻辑结构 Oracle数据库的逻辑结构是一种层次化的组织方式,主要包括以下组成部分: 1. **数据块(Data Blocks)** - **定义**:数据块是Oracle数据库中...
本文将深入探讨Oracle9i数据库的逻辑结构,帮助读者更好地理解其内部机制,并为实际操作提供指导。 #### 二、Oracle9i数据库逻辑结构概述 Oracle9i的逻辑存储结构主要由表空间(Tablespaces)、段(Segments)、区...
总而言之,通过掌握PowerDesigner9.5的物理模型功能,并结合对Oracle数据库的深入理解,IT专业人员可以有效地设计出满足性能需求、易于维护的数据库系统。这需要不断学习和实践,但借助上述文档和工具,这个过程将变...
理解Oracle的物理和逻辑结构对于数据库管理员来说非常重要,因为它们直接影响到数据的存储、查询性能和故障恢复。在日常管理和维护中,合理规划表空间、调整段和区间大小、优化索引等都是提升数据库性能的关键。 综...
理解Oracle 9i的逻辑结构对于有效地管理和优化数据库性能至关重要。通过合理地划分表空间,配置数据文件和管理数据块,可以确保数据库的稳定性和高效性。同时,根据业务需求创建和调整回退表空间和临时表空间,可以...
总的来说,Oracle物理删除数据文件恢复是一项技术性强、要求高的任务,但通过理解数据库的工作原理、熟悉Oracle的恢复命令,以及具备良好的问题解决能力,你完全可以应对这类挑战。在实践中不断积累经验,你将成为一...
Oracle数据库是世界上最流行的商业关系型数据库管理系统之一,其复杂性和高效性主要体现在其逻辑结构、物理结构和实例的巧妙设计上。本篇文章将深入探讨Oracle的这三个关键组成部分。 首先,Oracle的逻辑结构是用户...
逻辑备份不同于物理备份,它不涉及数据文件的复制,而是导出数据库对象的定义和数据到一个文件中,然后在需要时导入这些数据。 21、逻辑备份原理 逻辑备份通过创建数据库对象的元数据和数据的文本表示来工作。exp...
Oracle 数据库的物理存储结构是其核心组成部分,它涉及到数据在操作系统层面上的实际存储和管理。这一章主要探讨了如何规划和管理Oracle数据库的物理存储结构,以确保数据的安全性和高效性。 首先,理解Oracle...
综上所述,Oracle数据库的逻辑结构是一个精细设计的多层次体系,它将复杂的物理存储抽象成易于管理和优化的逻辑组件。理解这些逻辑结构及其相互关系对于数据库管理员来说至关重要,因为这直接影响到数据库的性能、...