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

75次阅读
没有评论

共计 4007 个字符,预计需要花费 11 分钟才能阅读完成。

本篇文章为大家展示了如何理解 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 逻辑读和物理读,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注丸趣 TV 行业资讯频道。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-19发表,共计4007字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)