9i DB_FILE_MULTIBLOCK_READ_COUNT参数和extent大小的设置
Oracle通過兩種方式從表中獲取數(shù)據(jù):
·????????? 通過ROWID(通常使用索引掃描時(shí))
·????????? 通過全表掃描
如果通過ROWID讀取數(shù)據(jù),表中的區(qū)間數(shù)就不是讀性能的一個(gè)因素(如果使用并行查詢,那么一個(gè)表中有較多的區(qū)間的數(shù)量可以明顯提高I/O的性能),Oracle將通過ROWID直接找到需要的行,并獲取相應(yīng)數(shù)據(jù)。
如果是全表掃描,那么區(qū)間的尺寸大小就有可能導(dǎo)致性能問題。因?yàn)槿頀呙钑r(shí),Oracle會(huì)一次讀取多個(gè)Blocks。每次讀取的塊數(shù)將受初始化參數(shù)DB_FILE_MULTIBLOCK_READ_COUNT和操作系統(tǒng)的I/O緩沖區(qū)大小的限制。比如說,如果Oracle Block的大小是4KB,操作系統(tǒng)I/O緩沖區(qū)大小是64KB,那么在全表掃描時(shí)每次最多可以讀取16各塊(Oracle Blocks),所以此時(shí)將DB_FILE_MULTIBLOCK_READ_COUNT的值設(shè)置為超過16也改變不了全表掃描的性能了。
通常,設(shè)置DB_FILE_MULTIBLOCK_READ_COUNT參數(shù)是如下考慮的:
(1)???????? 使用一個(gè)單獨(dú)的數(shù)據(jù)文件創(chuàng)建一個(gè)新的表空間
(2)???????? 在該表空間中創(chuàng)建一個(gè)單獨(dú)的未索引的表
(3)???????? 查詢V$FILESTAT以驗(yàn)證該測(cè)試的初始統(tǒng)計(jì)值
(4)???????? 在表上執(zhí)行全表掃描
(5)???????? 查詢V$FILESTAT以確定該測(cè)試的終止統(tǒng)計(jì)值,并從中減去開始統(tǒng)計(jì)值。將PhyBlkRds值除以PhyRds以確定有效的多塊讀計(jì)數(shù)。
(6)???????? 刪除這個(gè)用于測(cè)試的表空間
C:\>sqlplus "/as sysdba"
?
SQL*Plus: Release 9.2.0.1.0 - Production on 星期六 6月 28 10:11:22 2003
?
Copyright (c) 1982, 2002, Oracle Corporation.? All rights reserved.
?
已連接到空閑例程。
?
SQL> startup
ORACLE 例程已經(jīng)啟動(dòng)。
?
Total System Global Area?? 93395628 bytes
Fixed Size?????????????????? 453292 bytes
Variable Size????????????? 67108864 bytes
Database Buffers?????????? 25165824 bytes
Redo Buffers???????????????? 667648 bytes
數(shù)據(jù)庫裝載完畢。
數(shù)據(jù)庫已經(jīng)打開。
SQL> show parameter db_block_size;
?
NAME???????????????????????????????? TYPE??????? VALUE
------------------------------------ ----------- ---------------------
db_block_size??????????????????????? integer???? 8192
SQL> show parameter DB_FILE_MULTIBLOCK_READ_COUNT;
?
NAME???????????????????????????????? TYPE??????? VALUE
------------------------------------ ----------- ----------
db_file_multiblock_read_count??????? integer???? 16
SQL>
?
使用一個(gè)單獨(dú)的數(shù)據(jù)文件創(chuàng)建一個(gè)新的表空間:
SQL> create tablespace lunar
? 2? datafile 'd:\lunar.dbf' size 10m
? 3? default storage(initial 1m next 1m pctincrease 0);
?
表空間已創(chuàng)建。
?
在該表空間中創(chuàng)建一個(gè)單獨(dú)的未索引的表:
SQL> create table lunar
? 2? tablespace lunar
? 3? as select * from dba_objects;
?
表已創(chuàng)建。
?
SQL> select relative_fno from dba_data_files
? 2? where tablespace_name='LUNAR';
?
RELATIVE_FNO
------------
????????? 15
?
查詢V$FILESTAT以驗(yàn)證該測(cè)試的初始統(tǒng)計(jì)值:
SQL> select phyrds,phyblkrd from v$filestat
? 2? where file#=15;
?
??? PHYRDS?? PHYBLKRD
---------- ----------
???????? 0????????? 0
?
在表上執(zhí)行全表掃描:
SQL> select count(*) from lunar;
?
? COUNT(*)
----------
???? 27547
?
查詢V$FILESTAT以確定該測(cè)試的終止統(tǒng)計(jì)值:
SQL> select phyrds,phyblkrd from v$filestat
? 2?? where file#=15;
?
??? PHYRDS?? PHYBLKRD
---------- ----------
??????? 24??????? 376
?
SQL>
?
PHYRDS 和 PHYBLKRD 的初始統(tǒng)計(jì)的值都是0;
PHYRDS 和 PHYBLKRD 的終止統(tǒng)計(jì)的值分別是24和 376;
PHYRDS 的終止統(tǒng)計(jì)的值 - PHYRDS 的初始統(tǒng)計(jì)的值 =24;
PHYBLKRD 的終止統(tǒng)計(jì)的值 - PHYBLKRD 的初始統(tǒng)計(jì)的值 =376;
PHYBLKRD 的差值 / PHYRDS 的差值 = 15.67
所以,有效的多塊讀計(jì)數(shù)是16
需要注意的是,如果不是用新的表空間測(cè)試,那么測(cè)試得到第3步和第5步的差值后,在會(huì)話級(jí)改變DB_FILE_MULTIBLOCK_READ_COUNT參數(shù),然后再次得到第3步和第5步的差值,并重復(fù)測(cè)過程。
記住,不要將DB_FILE_MULTIBLOCK_READ_COUNT參數(shù)設(shè)置的比計(jì)算的值高。
??
設(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ì)性能的影響是顯而易見的。
???? 綜上,總結(jié)起來設(shè)置區(qū)間大小時(shí)需要考慮下面的問題:
·????????? 創(chuàng)建明顯大于或者等于操作系統(tǒng)I/O緩沖區(qū)大小的區(qū)間(最好是操作系統(tǒng)I/O緩沖區(qū)大小的整數(shù)倍)。這樣,如果區(qū)間非常大,即使區(qū)間大小不是操作系統(tǒng)I/O緩沖區(qū)大小的整倍數(shù),也只需要很少的附加讀操作(如果上面的640KB和80KB的差異)。
·????????? 設(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ù)倍
轉(zhuǎn)載于:https://www.cnblogs.com/cav5lier/archive/2013/06/13/3134063.html
總結(jié)
以上是生活随笔為你收集整理的9i DB_FILE_MULTIBLOCK_READ_COUNT参数和extent大小的设置的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 获取控制卡文件信息
- 下一篇: java collections读书笔记