天天看點

Oracle db_file_mulitblock_read_count參數

     Oracle DB_FILE_MULTIBLOCK_READ_COUNT是Oracle比較重要的一個全局性參數,可以影響系統級别及sessioin級别。主要是用于設定最小化表掃描時Oracle一次按順序能夠讀取的資料塊數。通常情況下,我們看到top events中的等待事件db file scattered read時會考慮到增加該參數的值。但是否增加了DB_FILE_MULTIBLOCK_READ_COUNT的值就一定可以減少db file scattered read? 本文描述了DB_FILE_MULTIBLOCK_READ_COUNT的設定并給出示範。

1、參數DB_FILE_MULTIBLOCK_READ_COUNT(MBRC)

       參數DB_FILE_MULTIBLOCK_READ_COUNT簡寫為(MBRC)。

       該參數是最小化表掃描的重要參數,用于指定Oracle一次按順序能夠讀取的資料塊數。理論上該值越大則能夠讀取的資料塊越多。

       實作全表掃描,索引全掃描及索引快速掃描所需的I/O總數取決于該參數,以及表自身的大小,是否使用并行等等。

       Oracle 10gR2以後會根據相應的作業系統及buffer cache以最優化的方式來自動設定該參數的值。通常情況下該值為1MB/db_block_size。

       在最大I/O為1MB的情況下,block的大小為8KB,則參數的值為128。如果在最大I/O為64KB,block為8KB,則參數的值為8。

       對于OLTP和batch環境該參數的值為4到16,DSS環境應設定大于16以上或大的值。

       該參數的變化對資料庫性能産生整體性的影響,過大的設定會導緻大量SQL通路路徑發生變化,如原先的索引掃描傾向于使用全表掃描。

       按照Oracle的建議在10g R2之後盡可能使用oracle自動設定的值。

2、參數DB_FILE_MULTIBLOCK_READ_COUNT與SSTIOMAX

     In Release 9.2 and above; follow the explanation below:

     Each version of Oracle on each port, is shipped with a preset maximum of how much data can be transferred in a single read (which of course is equivalent to the db_file_multiblock_read_count since the block size is fixed).

     For 8i and above (on most platforms) this is 1Mb and is referred to as SSTIOMAX.

     To determine it for your port and Oracle version, simply set db_file_multiblock_read_count to a nonsensical value and Oracle will size it down for you.

     從上面的描述可知,Oracle 9.2之後,有一個名叫SSTIOMAX的東東,限制了MBRC的設定。

     由于SSTIOMAX大多數平台最大單次I/O為1MB,db_block_size為8kb,是以MBRC參數的最大值通常為128。128*8kb=1mb。

     對于設定大于1MB的情形,即MBRC*db_block_size>SSTIOMAX的情形,則設定的值并不生效,而是使用符合SSTIOMAX的最大MBRC值。

3、如何計算MBRC

     The formula as internally used is as below:

         db_file_multiblock_read_count = min(1048576/db_block_size , db_cache_size/(sessions * db_block_size))

     Without WORKLOAD stats, CBO computes multiblock reads as:

          io_cost = blocks/(1.6765 * power(db_file_multiblock_read_count,0.6581))

     With WORKLOAD stats, then:

          io_cost = blocks/mbrc * mreadtim/sreadtim

     下面是不同情形設定所緻的最大i/o

        db_blocks_size      tablespace block size      db_file_multiblock_read_count   max_fetch_blocks_in_single_read

     ---------------     ----------------------     -----------------------------   -------------------------------

     8k                  8k                         32                              8*32=256kb(i/o)

     8k                  4k                         32                              8*32/4=64kb(i/o)

     8k                  8k                         not explicitly set              determined by OS and db_cache_size

     8k                  8k                         >128                            8*128=1MB(i/o)

4、哪些情形導緻單次多塊讀少于預設定

     a、讀段頭時單塊讀(此情形顯而易見,通常一個extent包含一個段頭header)

     b、實體讀不能跨越多個區(extent)

     c、部分資料塊已經位于高速緩存則不會從I/O子系統再次讀取,除非是直接讀(direct path read)。

5、示範不同值的MBRC單次讀的block(system級别)

6、示範不同MBRC所耗用的時間(session級别)

更多參考

<a href="http://blog.csdn.net/robinson_0612/article/details/7783724">DML Error Logging 特性 </a>

<a href="http://blog.csdn.net/robinson_0612/archive/2010/12/15/6078622.aspx">PL/SQL --&gt; 遊标</a>

<a href="http://blog.csdn.net/robinson_0612/archive/2010/12/22/6092066.aspx">PL/SQL --&gt; 隐式遊标(SQL%FOUND)</a>

<a href="http://blog.csdn.net/robinson_0612/article/details/7536926">批量SQL之 FORALL 語句</a>

<a href="http://blog.csdn.net/robinson_0612/article/details/7545597">批量SQL之 BULK COLLECT 子句</a>

<a href="http://blog.csdn.net/robinson_0612/article/details/7372061">PL/SQL 集合的初始化與指派</a>

<a href="http://blog.csdn.net/robinson_0612/article/details/7372061">PL/SQL 聯合數組與嵌套表</a>

<a href="http://blog.csdn.net/robinson_0612/article/details/7387647">PL/SQL 變長數組</a>

<a href="http://blog.csdn.net/robinson_0612/article/details/6084390">PL/SQL --&gt; PL/SQL記錄</a>

<a href="http://blog.csdn.net/robinson_0612/article/details/7422254">SQL tuning 步驟</a>

<a href="http://blog.csdn.net/robinson_0612/article/details/7406672">高效SQL語句必殺技</a>

<a href="http://blog.csdn.net/robinson_0612/article/details/6893477">父遊标、子遊标及共享遊标</a>

<a href="http://blog.csdn.net/robinson_0612/article/details/6904229">綁定變量及其優缺點</a>

<a href="http://blog.csdn.net/robinson_0612/article/details/6866925">dbms_xplan之display_cursor函數的使用</a>

<a href="http://blog.csdn.net/robinson_0612/article/details/6866870">dbms_xplan之display函數的使用</a>

<a href="http://blog.csdn.net/robinson_0612/article/details/6860007">執行計劃中各字段各子產品描述</a>

<a href="http://blog.csdn.net/robinson_0612/article/details/6837771">使用 EXPLAIN PLAN 擷取SQL語句執行計劃</a>