第六講--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。塊
檢視塊大小:
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