tft每日頭條

 > 生活

 > oracle數字類型

oracle數字類型

生活 更新时间:2024-06-28 09:19:54
概述

在ORACLE數據庫中有物理讀(Physical Reads)、邏輯讀(Logical Reads)、一緻性讀(Consistant Get)、當前模式讀(DB Block Gets)等諸多概念,下面對這些概念做個簡單介紹。


基本概念

1、物理讀(Physical Reads)

從磁盤讀取數據塊到内存的操作叫物理讀,當SGA裡的高速緩存(Cache Buffer)裡面不存在這些數據塊時,就會産生物理讀,另外。像全表掃描、磁盤排序等操作也可能産生物理讀,原因也是因為ORACLE數據庫需要訪問的數據塊較多,而有些數據塊不在内存當中,需要從磁盤讀取。

2、邏輯讀(Logical Reads)

概念1:邏輯讀指ORACLE從内存讀到的數據塊數量。一般來說, logical reads = db block gets consistent gets

概念2:邏輯讀指的就是從Buffer Cache中讀取數據塊。按照訪問數據塊的模式不同,可以分為當前模式讀(Current Read)和一緻性讀(Consistent Read)。 

這兩個概念本質是一樣的,隻是措辭不一樣。

3、一緻性讀(Consistant Get)

ORACLE是一個多用戶系統。當一個會話開始讀取數據還未結束讀取之前,可能會有其他會話修改了它将要讀取的數據。如果會話讀取到修改後的數據,就會造成數據的不一緻。一緻性讀就是為了保證數據的一緻性。在Buffer Cache中的數據塊上都會有最後一次修改數據塊時的SCN。如果一個事務需要修改數據塊中數據,會先在回滾段中保存一份修改前數據和SCN的數據塊,然後再更新Buffer Cache中的數據塊的數據及其SCN,并标識其為“髒”數據。當其他進程讀取數據塊時,會先比較數據塊上的SCN和進程自己的SCN。如果數據塊上的SCN小于等于進程本身的SCN,則直接讀取數據塊上的數據;如果數據塊上的SCN大于進程本身的SCN,則會從回滾段中找出修改前的數據塊讀取數據。通常,普通查詢都是一緻性讀。

4、當前模式讀(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。


實驗

1、兩次執行同樣的SQL

conn / as sysdba; create table test as select * from dba_objects; alter session set sql_trace=true; set autotrace on; select object_type, count(1) from test group by object_type; select object_type, count(1) from test group by object_type;

oracle數字類型(你知道ORACLE物理讀邏輯讀)1

oracle數字類型(你知道ORACLE物理讀邏輯讀)2

如上截圖所示, SQL語句第一次執行時,一緻性讀(consistent gets)為1320, 物理讀(physical reads)為1557,當前模式讀(db block gets)為0. 如果你再執行一次上面SQL語句,你會發現物理讀(physical reads)會降低為1241了,

因為上一次查詢,ORACLE已經将表test的所有數據塊讀取到buffer cache裡面了。當然生産環境實際情況會複雜很多。

2、生成并查看跟蹤文件

set autotrace off alter session set sql_trace =false; SELECT T.value ||'/'|| Lower(Rtrim(I.INSTANCE, Chr(0)))||'_ora_' || P.spid || '.trc' TRACE_FILE_NAME FROM (SELECT P.spid FROM v$mystat M, v$session S, v$process P WHERE M.statistic# = 1 AND S.sid = M.sid AND P.addr = S.paddr) P, (SELECT T.INSTANCE FROM v$thread T, v$parameter V WHERE V.name = 'thread' AND ( V.value = 0 OR T.thread# = To_number(V.value) )) I, (SELECT value FROM v$parameter WHERE name = 'user_dump_dest') T;

oracle數字類型(你知道ORACLE物理讀邏輯讀)3

3、用tkprof工具格式化一下trace文件,分析nwppdb_ora_5460.trc

tkprof nwppdb_ora_5460.trc out_5460.prf aggregate=no

oracle數字類型(你知道ORACLE物理讀邏輯讀)4


其實在最後生成trace應該是有地方弄錯了,這裡我拿trace是為了計算物理讀和一緻性讀,可惜沒有計算出來。大家有空可以自己研究下。

後面會分享更多關于DBA方面的内容,感興趣的朋友可以關注下!!

oracle數字類型(你知道ORACLE物理讀邏輯讀)5

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved