2008-11-17 574 views
21

我現在正在處理Oracle DBA,他向我發送了一些他已完成的分析。他的報告中的一個術語是'緩衝區獲取',任何想法這實際上意味着什麼?我的猜測是從緩衝區檢索字節,但我真的不知道。下面是一些示例輸出:在Oracle中,'Buffer Gets'實際上指的是什麼?

Buffer Gets Executions Gets per Exec %Total Time (s) Time (s) Hash Value 
--------------- ------------ -------------- ------ -------- --------- ---------- 
    137,948,100  31,495  4,380.0 98.4 6980.57 6873.46 4212400674 
Module: JDBC Thin Client 
SELECT fieldOne, fieldTwo, fieldThree, fieldFour, fieldFive FROM TableExample 
WHERE fieldOne = 'example' 

這也將是很方便的知道的意思是「每Exec的獲取」什麼,我想他們有關係嗎?我是一名程序員,但不是DBA。

回答

38

Oracle存儲被安排成給定大小的塊(例如8k)。表和索引由磁盤上的一系列塊組成。當這些塊在內存中時,它們佔用一個緩衝區。

當Oracle需要一個塊時,它會執行一個緩衝區得到。首先檢查它是否已經有了它在內存中需要的塊。如果是這樣,則使用內存版本。如果內存中沒有該塊,則它將從磁盤讀取到內存中。

因此,緩衝區get表示Oracle必須訪問塊的次數。讀取可能已經從內存(緩衝區)中得到滿足,或者導致物理IO。

由於物理IO非常昂貴(與內存或CPU相比),調整的一種方法是集中精力減少緩衝區獲取,假定緩衝區獲取將減少物理IO。

+3

是 - 上補充,許多查詢成本模型幾乎完全集中在磁盤I/O,其緩衝得到的模型(不完美,但儘量接近它可以)。所以,這意味着一個簡單的成本函數 - 「這個查詢的代價是多少,忽略了CPU(反正它幾乎可以忽略不計)?」 – 2008-11-17 14:22:08

+0

感謝您的非常好的回答,我唯一留下的問題是,對於上面的數據是137,948,100,對於稱爲31,495次的選擇查詢而言,高數量的緩衝區會得到什麼?這個數字可以表示像表掃描VS索引等東西嗎? – rustyshelf 2008-11-17 23:12:56

11

只是爲了回答你的問題是WW沒有的一部分:

「每Exec的獲取」僅僅是被該語句的執行數除以。您可能會有一個非常有效但多次執行的聲明;這將有大量的總緩衝區獲取,但獲得每個可執行比率較低。

-1

我只想稍微考慮一下。

在第一個戴夫科斯塔是正確的,緩衝區獲取執行是真正重要的。

有了這些數據,我們不能說,如果他們過多或「因爲你不說有多少條記錄查詢提取

如果提取4000點的記錄也許4,380都ok 如果你只能提取1條記錄它們可能太多了

那麼,有多少條記錄?

還有更多,你有一個SQL計劃,看看? 你有一個在fieldOne上的索引?

正確的索引是調整查詢的第一個「祕密」。

只是我的2美分