sql語句執行時,產生一致性讀。
什麼是邏輯讀? cpu在記憶體中讀這些block的過程就叫做邏輯讀(consistent get),在讀的過程中產生的IO就是邏輯IO.邏輯讀的過程中,是非常消耗cpu資源的.因此,執行sql的邏輯讀越少越好.sql調優必須調整buffer get很大的sql語句
logical reads= consistent gets + db block gets,邏輯讀其實是DB BLOCK GETS 和 consistents Gets 之和
DB block gets---當前請求的塊數目
Consistent gets---資料請求總數在復原段buffer中的資料一致性讀所需要的資料區塊
Physical Reads---從磁碟讀取資料區塊的數量(主要原因:buffer中不存在這些塊;全表掃描;磁碟排序)
對於整個系統而言,我們用AWR報告為例。
1. 首先要關注的自然是Elapsed Time最高的那些,執行時間最長通常意味著消耗了更多的資源(無論這個資源是物理讀還是邏輯讀)
2. 其次關注的是Buffer Gets最多的SQL,這就是DB block gets+Consistent gets最多的SQL。大量的不必要的buffer gets會導致CPU time升高,在一個健康並且負載不低並且並不是以計算為主的系統中,CPU time佔據首位的Top event通常是需要關注的。
3. 再其次關注Physical Reads最多的,並不是說物理讀多的不容易調整,才放在後面關注,實際上是物理讀通常都被基本的調優手段給調整完了,如果一個OLTP系統有大量的物理讀,那麼應該早就掛掉了,這是很明顯的效能問題,會優先就調整好。
Oracle讀取資料的方式有2種
1.物理讀即是把資料從磁碟讀入到buffer catch的過程。
通常情況下是,如果需要資料的時候發現不存在於buffer catch當中,即oracle就會執行物理讀。
2.邏輯讀取
邏輯讀指的就是從(或者視圖從)Buffer Cache中讀取資料區塊。按照訪問資料區塊的模式不同,可以分為即時讀(Current Read)和一致性讀(Consistent Read)。
(1)即時讀 db block gets
即時讀即讀取資料區塊當前的最新資料。任何時候在Buffer Cache中都只有一份當前資料區塊。即時讀通常發生在對資料進行修改、刪除操作時。這時,進程會給資料加上行級鎖,並且標識資料為“髒”資料。
(2)一致性讀 consistent get
Oracle是一個多使用者系統。當一個會話開始讀取資料還未結束讀取之前,可能會有其他會話修改它將要讀取的資料。如果會話讀取到修改後的資料,就會造成資料的不一致。
一致性讀就是為了保證資料的一致性。在Buffer Cache中的資料區塊上都會有最後一次修改資料區塊時的SCN。
2.為什麼要一致性讀,為了保持資料的一致性
如果一個事務需要修改資料區塊中資料,會先在復原段中儲存一份修改前資料和SCN的資料區塊,然後再更新Buffer Cache中的資料區塊的資料及其SCN,並標識其為“髒”資料。
當其他進程讀取資料區塊時,會先比較資料區塊上的SCN和進程自己的SCN。如果資料區塊上的SCN小於等於進程本身的SCN,則直接讀取資料區塊上的資料;
如果資料區塊上的SCN大於進程本身的SCN,則會從復原段中找出修改前的資料區塊讀取資料。通常,普通查詢都是一致性讀。