Full Scanを速くしちゃう その2

<Full Scanを速くしちゃう その2>
ペンネーム:グリーンペペ

前回”db_file_multiblock_read_count=128″でパフォーマンスが頭打ちになっ
た件を検証する。

◆おさらい
初期化パラメータ”db_file_multiblock_read_count”には以下公式による上限
値がある。

db_file_multiblock_read_count =< 最大I/Oサイズ / db_block_size

UNIX環境の場合の最大I/Oサイズは"1MB"である。
よって"db_block_size=4KB"の場合、"db_file_multiblock_read_count=256"が
上限であるが、パフォーマンスは"128"で頭打ちになった。

◆環境
HP-UX hp11i B.11.11
Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 – 64bit
初期化パラメータdb_block_size=4KB

◆検証1
v$active_session_historyビューにより、1回のI/Oによる最大読込みブロック
数を見極める。v$active_session_historyビューの詳細についてはこちら↓
https://www.insight-tec.com/mailmagazine/ora3/vol217.html


SQL> alter session set db_file_multiblock_read_count=256;

SQL> select /* 256blk */ count(*) from tpc2.stock2;

SQL> select a.event,a.p1,a.p2,a.p3 from v$active_session_history a,v$sql s
     where a.sql_id=s.sql_id and
     a.event='db file scattered read' and
    s.sql_text='select /* 256blk */ count(*) from tpc2.stock2'
     order by p3 desc;

EVENT                             P1         P2         P3
------------------------- ---------- ---------- ----------
db file scattered read             8      44945        128
db file scattered read             8      43665        128
db file scattered read             8      41745        128
db file scattered read             8      40977        128
db file scattered read             8      38033        128
db file scattered read             8      35473        128
db file scattered read             8      33937        128
db file scattered read             8      32657        128
db file scattered read             8      30609        128
db file scattered read             8      29073        128
===以下略===



wait event='db file scattered read'のパラメータに注目して頂きたい。
各パラメータは下記を表す。

p1=データファイルid
p2=ブロック番号
p3=読込みブロック数

今回の検証環境では"db_file_multiblock_read_count"初期化パラメタは"256"
を設定しているが、実際の1回のI/Oによる最大読込みブロック数は"128"であ
った。つまり、"128"以上の指定は今回の検証環境は無効なのである。
無効であるばかりでなく、パフォーマンスに悪影響を与える場合がある。
前回の検証の実行計画に注目して頂きたい。


◆検証2
"db_file_multiblock_read_count"設定値が違う際のコストを比較する

◇Case1 db_file_multiblock_read_count=128


SELECT STATEMENT Optimizer=ALL_ROWS (Cost=5753 Card=1)
  SORT (AGGREGATE)
    TABLE ACCESS (FULL) OF 'STOCK2' (TABLE) (Cost=5753 Card=492068)

◇Case2 db_file_multiblock_read_count=256

SELECT STATEMENT Optimizer=ALL_ROWS (Cost=5594 Card=1)
  SORT (AGGREGATE)
    TABLE ACCESS (FULL) OF 'STOCK2' (TABLE) (Cost=5594 Card=492068)

Costパラメータを見ると"db_file_multiblock_read_count=256"の場合の方が
コストが低い。
つまり、Full Scanのコストが誤って低く見積もられ、オプティマイザがIndex
ScanではなくFull Scanを選択してしまう可能性がある。

◆まとめ
Full Scanを速くするには初期化パラメタ"db_file_multiblock_read_count"の
変更は有効なチューニングである。
しかしながら、実際の1回のI/Oによる最大読込みブロック数を超えて設定して
しまうとオプティマイザがFull Scanのコストを誤って低く見積もってしまい、
思いがけないパフォーマンス劣化を招く惧れがある。
貴社の環境でも、"db_file_multiblock_read_count"の上限値を見極め、有効
にチューニングすることをお勧めしたい。

ビール片手にお仕事(希望)茅ヶ崎にて