1. 程式人生 > >第六講--buffer cache作用概述

第六講--buffer cache作用概述

Oracle資料庫有三大檔案:*.ctl、*.dbf、*.log。

塊的概念:

Oracle把dbf檔案分成一個個大小相等的塊(block),塊大小通常為8k。塊是oracle進行IO的最小單位。塊裡面放的資料行,一個塊裡放多個數據行,一般而言,一個數據行不會被放在多個數據塊裡面。

當一個select語句要查詢一行資料時,oracle通過計算定位到資料塊。這個資料塊裡有20行資料,但是我們只訪問其中一行,oracle向磁碟發出IO請求,請求一個數據塊,作業系統會把整個塊讀到記憶體裡去,CPU在塊裡面找到我們需要的資料行,然後返給使用者。

我們只要一行資料但是oracle卻把20行資料讀到記憶體,這種做法彷彿很低效。其實不然,磁碟IO最耗費時間的部分是尋道時間,佔整個IO過程的90%,我們從磁碟讀20行資料到記憶體,耗費的時間與尋道時間相比少得多。而且程式具有區域性性,其餘的19行資料極可能在接下來執行過程中被訪問,所以與其讀一行資料不如多讀一點。

段的概念:

一個表就是一個段。

區的概念:

物理上連續的塊。建表(段)的時候oracle首先給段分配一個區,當第一個區用完之後,oracle會繼續給段分配區。區是oracle給段分配空間的最小單位。

Buffer cache和*.dbf是對應的。Buffercache快取的是dbf的資料,既然dbf被分為大小相等的塊,那麼buffer cache也被分成一個個的塊。dbf裡一個塊叫做block,buffer cache裡面一個塊叫做buffer,block和buffer是一一對應的。

Buffer cache的意義:

1.      快取dbf檔案。buffer cache的命中率比shared pool的命中率更重要,buffer cache只要是沒有命中,一定發生物理IO,物理IO必然尋道,這樣的話效能很差;

2.      構造cr塊;

什麼是cr塊?

一個會話修改的資料在commit之前,其他使用者時看不到的。

Sqlplus1修改data row 1但是沒有提交,然後sqlplus2來讀塊1,此時塊1是不完整的,sqlplus2不能直接讀塊1。於是sqlplus2會在記憶體裡面單獨申請一個塊,即塊2。塊1中沒有修改的資料行(data row2)被直接填入塊2,sqlplus2會把修改前的data row 1找出來填入塊2。Sqlplus2去哪裡找修改前的data row 1呢,oracle資料庫裡面有一堆名叫回滾(undo)的dbf檔案,undo檔案裡面儲存sqlplus1修改前的未提交的data row 1資料。Sqlplus2在undo檔案裡找到修改前的data row 1。

2被稱為cr。塊1和塊2都是buffer塊。

檢視塊大小:

SQL> show parameter block
 
NAME                                 TYPE
--------------------------------------------------------------------
VALUE
------------------------------
db_block_buffers                     integer
0
db_block_checking                    string
FALSE
db_block_checksum                    string
TRUE
db_block_size                        integer
8192
db_file_multiblock_read_count        integer
 
NAME                                 TYPE
------------------------------------ --------------------------------
VALUE
------------------------------
16
8192位元組 = 8k