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://old.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”の上限値を見極め、有効
にチューニングすることをお勧めしたい。
ビール片手にお仕事(希望)茅ヶ崎にて