在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,則會從回滾段中找出修改前的數據塊讀取數據。通常,普通查詢都是一緻性讀。
如上截圖所示, 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;
3、用tkprof工具格式化一下trace文件,分析nwppdb_ora_5460.trc
tkprof nwppdb_ora_5460.trc out_5460.prf aggregate=no
其實在最後生成trace應該是有地方弄錯了,這裡我拿trace是為了計算物理讀和一緻性讀,可惜沒有計算出來。大家有空可以自己研究下。
後面會分享更多關于DBA方面的内容,感興趣的朋友可以關注下!!
,
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!