驗證資料庫支援db_file_multiblock_read_count引數的最大值

尛樣兒發表於2012-11-14

        首先需要明確“db file sequential read”和“db file scattered read”兩種等待事件之間的區別,前者是單塊的順序讀,後者是多塊的一起讀,塊的個數受到db_file_multiblock_read_count的限制,一般是表或索引全掃描的時候會出現大量的“db file scattered read”等待事件,同時還需要關注以下兩點:
        1).這兩種等待事件會相伴出現,這是由於區中塊的個數,SGA中已包含部分塊,連結和遷移行,索引條目的維護(INSERT時)導致的。
        2).“db file scattered read”等待事件每次讀取塊的個數可能小於db_file_multiblock_read_count的限制值,這是主要是由於區間包含的塊個數和SGA已包含部分塊的原因造成的。
       對於全表或全索引掃描來說,總是希望都出現“db file scattered read”等待事件,這樣可以一定程度提高I/O讀的效能,db_file_multiblock_read_count預設的值可能過小,db_file_multiblock_read_count可調整的值受較多因素的影響,透過下面的方法可以檢查當前資料庫環境支援的db_file_multiblock_read_count最大值。

1.建立測試表(會話A)。
C:\Users\LIUBINGLIN>sqlplus / as sysdba

SQL*Plus: Release 11.2.0.3.0 Production on 星期三 11月 14 12:32:03 2012

Copyright (c) 1982, 2011, Oracle.  All rights reserved.


連線到:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production
With the Partitioning, Oracle Label Security, OLAP, Data Mining,
Oracle Database Vault and Real Application Testing options

SQL> create table db_file_multi (id number primary key,name char(2000));

表已建立。

SQL> begin
  2  for i in 1..10000 loop
  3  insert into db_file_multi values(i,'db_file_multi'||i);
  4  end loop;
  5  end;
  6  /

PL/SQL 過程已成功完成。

SQL> commit;

提交完成。

2.確定會話A的ORA PID和SPID。
SQL> select pid,spid from v$process where addr=(
  2  select paddr from v$session where sid=(
  3  select sid from v$mystat where rownum=1));

       PID SPID
---------- ------------------------
        30 700

3.啟動10046工具跟蹤會話A(會話B)。
C:\Users\LIUBINGLIN>sqlplus / as sysdba

SQL*Plus: Release 11.2.0.3.0 Production on 星期三 11月 14 12:37:42 2012

Copyright (c) 1982, 2011, Oracle.  All rights reserved.


連線到:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production
With the Partitioning, Oracle Label Security, OLAP, Data Mining,
Oracle Database Vault and Real Application Testing options

SQL> oradebug setorapid 30
Oracle pid: 30, Windows thread id: 700, image: ORACLE.EXE (SHAD)
SQL> oradebug event 10046 trace name context forever,level 8
已處理的語句
SQL> oradebug tracefile_name
F:\APP\ORACLE\diag\rdbms\orcl\orcl\trace\orcl_ora_700.trc

4.執行測試過程(會話A)。
SQL> alter session set db_file_multiblock_read_count=1000;

會話已更改。

SQL> select /*+full(a)*/ count(1) from db_file_multi a;

  COUNT(1)
----------
     10000

5.檢視測試結果。

資料庫引數
db_file_multiblock_read_count的預設值:
SQL> show parameter db_file_multi

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_file_multiblock_read_count        integer     28

檢視F:\APP\ORACLE\diag\rdbms\orcl\orcl\trace\orcl_ora_700.trc檔案的內容:
......
WAIT #264101320: nam='db file scattered read' ela= 8221 file#=1 block#=90981 blocks=4 obj#=75753 tim=184163648833
WAIT #264101320: nam='db file scattered read' ela= 9623 file#=1 block#=90992 blocks=16 obj#=75753 tim=184163659036
WAIT #264101320: nam='db file scattered read' ela= 46159 file#=1 block#=91008 blocks=70 obj#=75753 tim=184163706503
WAIT #264101320: nam='db file sequential read' ela= 4815 file#=1 block#=91091 blocks=1 obj#=75753 tim=184163714982
......
       從上面的輸出看出,'db file scattered read'讀的塊數已經達到了70,但顯然這不是最大的,可以透過加入db_file_multi測試表更多的資料來檢視測試效果。


--end--

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23135684/viewspace-749200/,如需轉載,請註明出處,否則將追究法律責任。

相關文章