oracle dbfile数,通过案例学调优之--Oracle参数(db_file_multiblock_read_count)
通過案例學(xué)調(diào)優(yōu)之--Oracle參數(shù)(db_file_multiblock_read_count)
應(yīng)用環(huán)境:
操作系統(tǒng): RedHat EL55
Oracle: ? Oracle 10gR2
Oracle DB_FILE_MULTIBLOCK_READ_COUNT是Oracle比較重要的一個(gè)全局性參數(shù),可以影響系統(tǒng)級(jí)別及sessioin級(jí)別。主要是用于設(shè)置最小化表掃描時(shí)Oracle一次按順序能夠讀取的數(shù)據(jù)塊數(shù)。通常情況下,我們看到top events中的等待事件db file scattered read時(shí)會(huì)考慮到增加該參數(shù)的值。
1、參數(shù)DB_FILE_MULTIBLOCK_READ_COUNT(MBRC)?????? 參數(shù)DB_FILE_MULTIBLOCK_READ_COUNT簡寫為(MBRC)。
該參數(shù)是最小化表掃描的重要參數(shù),用于指定Oracle一次按順序能夠讀取的數(shù)據(jù)塊數(shù)。理論上該值越大則能夠讀取的數(shù)據(jù)塊越多。
實(shí)現(xiàn)全表掃描,索引全掃描及索引快速掃描所需的I/O總數(shù)取決于該參數(shù),以及表自身的大小,是否使用并行等等。
Oracle 10gR2以后會(huì)根據(jù)相應(yīng)的操作系統(tǒng)及buffer cache以最優(yōu)化的方式來自動(dòng)設(shè)定該參數(shù)的值。通常情況下該值為1MB/db_block_size。
在最大I/O為1MB的情況下,block的大小為8KB,則參數(shù)的值為128。如果在最大I/O為64KB,block為8KB,則參數(shù)的值為8。
對(duì)于OLTP和batch環(huán)境該參數(shù)的值為4到16,DSS環(huán)境應(yīng)設(shè)置大于16以上或大的值。
該參數(shù)的變化對(duì)數(shù)據(jù)庫性能產(chǎn)生整體性的影響,過大的設(shè)置會(huì)導(dǎo)致大量SQL訪問路徑發(fā)生變化,如原先的索引掃描傾向于使用全表掃描。
按照Oracle的建議在10g R2之后盡可能使用oracle自動(dòng)設(shè)置的值。
2、參數(shù)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之后,有一個(gè)名叫SSTIOMAX的東東,限制了MBRC的設(shè)置。
由于SSTIOMAX大多數(shù)平臺(tái)最大單次I/O為1MB,db_block_size為8kb,因此MBRC參數(shù)的最大值通常為128。128*8kb=1mb。
對(duì)于設(shè)置大于1MB的情形,即MBRC*db_block_size>SSTIOMAX的情形,則設(shè)置的值并不生效,而是使用符合SSTIOMAX的最大MBRC值。
3、如何計(jì)算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))
設(shè)置DB_FILE_MULTIBLOCK_READ_COUNT以充分利用操作系統(tǒng)I/O緩沖區(qū)的大小。應(yīng)考慮DB_FILE_MULTIBLOCK_READ_COUNT <= 操作系統(tǒng)I/O緩沖區(qū) / Oracle Block的大小,如果DB_FILE_MULTIBLOCK_READ_COUNT設(shè)置的太大,會(huì)使優(yōu)化器認(rèn)為全表掃描更有效而改變執(zhí)行計(jì)劃,然后實(shí)際情況并非如此。
如果必須創(chuàng)建小的區(qū)間,創(chuàng)建其大小是操作系統(tǒng)I/O緩沖區(qū)大小的整數(shù)倍
設(shè)置區(qū)間尺寸大小的考慮思路應(yīng)該是合理的利用Oracle的能力以便在全表掃描時(shí)執(zhí)行多塊存取,同時(shí)讀操作又是不能跨區(qū)間的。舉個(gè)例子,假設(shè)操作系統(tǒng)I/O緩沖區(qū)大小是64KB,考察讀取一個(gè)640KB大小的表,如果設(shè)置為每個(gè)區(qū)間64KB,一共10個(gè)區(qū)間,如果執(zhí)行全表掃描,則Oracle需要10次讀操作(相當(dāng)于一次讀一個(gè)區(qū)間);如果設(shè)置為一個(gè)640KB的區(qū)間,則Oracle還是需要10次讀操作(因?yàn)椴僮飨到y(tǒng)I/O緩沖區(qū)大小是64KB),可見壓縮區(qū)間并不能提高性能;如果設(shè)置為每個(gè)區(qū)間80KB,一共8個(gè)區(qū)間,則每個(gè)區(qū)間Oracle需要讀兩次,第一次讀64KB,第二次讀這個(gè)區(qū)間剩余的16KB(讀操作不能跨區(qū)間),所以總共需要16次讀操作(相當(dāng)于一次讀一個(gè)區(qū)間)。區(qū)間尺寸的設(shè)置對(duì)性能的影響是顯而易見的。
案例分析:
案例1
15:21:10 SYS@ test1 >show parameter mult
NAME ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? TYPE ? ? ? ?VALUE
------------------------------------ ----------- ------------------------------
db_file_multiblock_read_count ? ? ? ?integer ? ? 128
1)查看表中extent分配
14:46:03 SCOTT@ test1 >col segment_name for a20
14:46:15 SCOTT@ test1 >select segment_name,extent_id,bytes,blocks from user_extents
14:46:36 ? 2 ? where segment_name=‘T1‘;SEGMENT_NAME??????????EXTENT_ID??????BYTES?????BLOCKS
--------------------?----------?----------?----------
T1????????????????????????????0??????65536??????????8
T1????????????????????????????1??????65536??????????8
T1????????????????????????????2??????65536??????????8
T1????????????????????????????3??????65536??????????8
T1????????????????????????????4??????65536??????????8
T1????????????????????????????5??????65536??????????8
T1????????????????????????????6??????65536??????????8
T1????????????????????????????7??????65536??????????8
T1????????????????????????????8??????65536??????????8
T1????????????????????????????9??????65536??????????8
T1???????????????????????????10??????65536??????????8
T1???????????????????????????11??????65536??????????8
T1???????????????????????????12??????65536??????????8
T1???????????????????????????13??????65536??????????8
T1???????????????????????????14??????65536??????????8
T1???????????????????????????15??????65536??????????8
T1???????????????????????????16????1048576????????128
SEGMENT_NAME??????????EXTENT_ID??????BYTES?????BLOCKS
--------------------?----------?----------?----------
T1???????????????????????????17????1048576????????128
T1???????????????????????????18????1048576????????128
T1???????????????????????????19????1048576????????128
T1???????????????????????????20????1048576????????128
T1???????????????????????????21????1048576????????128
22?rows?selected.
2)配置10046進(jìn)行分析14:48:00?SCOTT@?test1?>alter?session?set?events?‘10046?trace?name?context?forever,level?8‘;
Session?altered.
14:48:57?SCOTT@?test1?>select?count(*)?from?t1;
COUNT(*)
----------
5002
14:49:09?SCOTT@?test1?>alter?session?set?events?‘10046?trace?name?context?off‘;
Session?altered.
3)查看trace文件
[[email?protected] ~]$ more ?/u01/app/oracle/diag/rdbms/test1/test1/trace/test1_ora_4160.trcWAIT?#2:?nam=‘db?file?sequential?read‘?ela=?9?file#=11?block#=691?blocks=1?obj#=16394?tim=1408604404294713
WAIT?#2:?nam=‘Disk?file?operations?I/O‘?ela=?26?FileOperation=2?fileno=4?filetype=2?obj#=16394?tim=1408604404294846
WAIT?#2:?nam=‘db?file?sequential?read‘?ela=?9?file#=4?block#=143?blocks=1?obj#=16394?tim=1408604404294872
WAIT?#2:?nam=‘db?file?scattered?read‘?ela=?23?file#=4?block#=157?blocks=3?obj#=16394?tim=1408604404294998
WAIT?#2:?nam=‘db?file?sequential?read‘?ela=?8?file#=4?block#=164?blocks=1?obj#=16394?tim=1408604404295041
WAIT?#2:?nam=‘db?file?sequential?read‘?ela=?8?file#=11?block#=727?blocks=1?obj#=16394?tim=1408604404295069
WAIT?#2:?nam=‘db?file?sequential?read‘?ela=?8?file#=4?block#=183?blocks=1?obj#=16394?tim=1408604404295097
WAIT?#2:?nam=‘db?file?scattered?read‘?ela=?33?file#=4?block#=187?blocks=5?obj#=16394?tim=1408604404295156
WAIT?#2:?nam=‘db?file?sequential?read‘?ela=?8?file#=4?block#=199?blocks=1?obj#=16394?tim=1408604404295191
WAIT?#2:?nam=‘db?file?scattered?read‘?ela=?51?file#=11?block#=153?blocks=8?obj#=16394?tim=1408604404295272
WAIT?#2:?nam=‘db?file?scattered?read‘?ela=?50?file#=11?block#=203?blocks=8?obj#=16394?tim=1408604404295355
WAIT?#2:?nam=‘db?file?scattered?read‘?ela=?52?file#=11?block#=213?blocks=8?obj#=16394?tim=1408604404295442
......
從以上文件可以看出,在“db file scattered read”中每次讀取的數(shù)據(jù)塊個(gè)數(shù)(blocks=8)不超過extent中blocks的大小(8個(gè));在“db file sequential read”中每次讀取的數(shù)據(jù)塊個(gè)數(shù)(blocks)為1個(gè)。
案例2:
15:21:10 SYS@ test1 >show parameter mult
NAME ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? TYPE ? ? ? ?VALUE
------------------------------------ ----------- ------------------------------
db_file_multiblock_read_count ? ? ? ?integer ? ? 128
1)創(chuàng)建新的segment
15:08:28 SCOTT@ test1 >create table t2 (id int)
15:08:35 ? 2? storage (initial 2048k next 2048k pctincrease 0);
Table created.
15:08:41 SCOTT@ test1 >col segment_name for a20
15:08:53 SCOTT@ test1 >select segment_name,tablespace_name,extent_id,bytes,blocks from user_extents
15:09:19 ? 2 ? where segment_name=‘T2‘;SEGMENT_NAME?????????TABLESPACE_NAME?????????????????EXTENT_ID??????BYTES?????BLOCKS
--------------------?------------------------------?----------?----------?----------
T2???????????????????USERS???????????????????????????????????0????1048576????????128
T2???????????????????USERS???????????????????????????????????1????1048576????????128
2)配置10046進(jìn)行分析15:11:00?SCOTT@?test1?>alter?session?set?events?‘10046?trace?name?context?forever,level?8‘;
Session?altered.
15:14:57?SCOTT@?test1?>select?count(*)?from?t2;
COUNT(*)
----------
32002
15:15:09?SCOTT@?test1?>alter?session?set?events?‘10046?trace?name?context?off‘;
Session?altered.
3)查看trace文件
[[email?protected] ~]$ more ?/u01/app/oracle/diag/rdbms/test1/test1/trace/test1_ora_4260.trcPARSE?#5:c=0,e=302,p=0,cr=0,cu=0,mis=1,r=0,dep=1,og=1,plh=0,tim=1408605696796384
EXEC?#5:c=1000,e=1131,p=0,cr=0,cu=0,mis=1,r=0,dep=1,og=1,plh=3321871023,tim=1408605696797594
WAIT?#5:?nam=‘db?file?sequential?read‘?ela=?75?file#=11?block#=512?blocks=1?obj#=16404?tim=1408605696797838
WAIT?#5:?nam=‘db?file?sequential?read‘?ela=?15?file#=11?block#=514?blocks=1?obj#=16404?tim=1408605696797913
WAIT?#5:?nam=‘db?file?scattered?read‘?ela=?1123?file#=11?block#=528?blocks=48?obj#=16404?tim=1408605696799202
從以上文件可以看出,在“db file scattered read”中每次讀取的數(shù)據(jù)塊個(gè)數(shù)(blocks=48)不超過extent中blocks的大小(128個(gè));在“db file sequential read”中每次讀取的數(shù)據(jù)塊個(gè)數(shù)(blocks)為1個(gè)。
附注:
原文:http://tiany.blog.51cto.com/513694/1543199
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的oracle dbfile数,通过案例学调优之--Oracle参数(db_file_multiblock_read_count)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 鸭血糕的功效与作用、禁忌和食用方法
- 下一篇: oracle外网监听端口,oracle