我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何理解Oracle逻辑读和物理读

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何理解Oracle逻辑读和物理读

本篇文章为大家展示了如何理解Oracle逻辑读和物理读,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

1.物理读(physical read)

物理读即是把数据从磁盘读入到buffer catch的过程。 通常情况下是,如果需要数据的时候发现不存在于buffer catch当中,即oracle就会执行物理读。

当数据块第一次读取到,就会缓存到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 consistent gets 说明多了2个 consistent gets  这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>

上述内容就是如何理解Oracle逻辑读和物理读,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注亿速云行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何理解Oracle逻辑读和物理读

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

SQLSERVER预读逻辑读物理读

预读:用估计信息,去硬盘读取数据到缓存。预读100次,也就是估计将要从硬盘中读取了100页数据到缓存。  物理读:查询计划生成好以后,如果缓存缺少所需要的数据,让缓存再次去读硬盘。物理读10页,从硬盘中读取10页数据到缓存。  逻辑读:从缓存中取出所有数据。逻
SQLSERVER预读逻辑读物理读
2015-06-11

SQL Server中STATISTICS IO物理读和逻辑读的误区

SQL Server中STATISTICS IO物理读和逻辑读的误区 大家知道,SQL Server中可以利用下面命令查看某个语句读写IO的情况SET STATISTICS IO ON那么这个命令的结果显示的物理读、逻辑读的IO单位大小是多少,比如结果显示有物
SQL Server中STATISTICS IO物理读和逻辑读的误区
2021-09-09

Bash中的逻辑和(&)该如何理解

本篇文章为大家展示了Bash中的逻辑和(&)该如何理解,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。在 Bash 中,你可以使用 & 作为 AND(逻辑和)操作符。有人可能会认为两篇文章中的 & 意
2023-06-16

Oracle中的逻辑备份和物理备份有什么区别

逻辑备份和物理备份是Oracle数据库中常用的两种备份方式,它们有以下区别:逻辑备份是通过SQL命令或工具将数据库中的数据和对象结构导出到一个备份文件中,备份文件中包含了数据库中的逻辑信息,如表结构、数据、存储过程等。而物理备份是通过直接复
Oracle中的逻辑备份和物理备份有什么区别
2024-04-09

如何理解linux shell逻辑运算符、逻辑表达式

这篇文章主要介绍“如何理解linux shell逻辑运算符、逻辑表达式”,在日常操作中,相信很多人在如何理解linux shell逻辑运算符、逻辑表达式问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何理解l
2023-06-09

如何理解Python中 and 和 or 运算短路逻辑

本篇文章为大家展示了如何理解Python中 and 和 or 运算短路逻辑,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。短路逻辑规则如下:表达式从左至右运算,若 or 的左侧逻辑值为 True ,则
2023-06-01

如何用VBS和bat批处理逐行读取文件

这篇文章主要介绍“如何用VBS和bat批处理逐行读取文件”,在日常操作中,相信很多人在如何用VBS和bat批处理逐行读取文件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何用VBS和bat批处理逐行读取文件
2023-06-08

编程热搜

目录