Full Scanを速くしちゃう その3
<Full Scanを速くしちゃう その3>
ペンネーム:グリーンペペ
Full Scanを速くするテクニックとして9i新機能であるマルチブロックサイズ
を取り上げる。
9i以前のバージョンでは、インスタンス作成時に指定したdb_block_size初期
化パラメータは変更できない。
9iからも同じくdb_block_sizeの変更はできないが、表領域にブロックサイズ
を指定し、ブロックサイズ別のバッファキャッシュを指定することで、1つの
インスタンス内で複数のブロックサイズを使用できるようになった。
ブロックサイズが大きくなれば1I/Oの転送量は増えるので、パフォーマンス
は向上するはずだ。早速検証してみよう。
◆環境
HP-UX hp11i B.11.11
Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 – 64bit
◆検証1
検証環境である”TPC2.STOCK2″のblock sizeを確認し、”TPC2.STOCK2″をFull
Scanする。
SQL> select name,value from v$parameter where name in ('db_file_multiblock_read_count','db_block_size'); NAME VALUE ------------------------------ ------ db_block_size 4096 db_file_multiblock_read_count 16 SQL> select ts.block_size from dba_tables tb,dba_tablespaces ts where tb.tablespace_name=ts.tablespace_name and tb.owner='TPC and tb.table_name='STOCK2'; BLOCK_SIZE ---------- 4096 SQL> select /* tbs4k */ count(*) from tpc2.stock2; Elapsed: 00:00:09.42
◆検証2
ブロックサイズ=32Kの表領域を作成し”TPC2.STOCK2″を移動、”TPC2.STOCK2″を
Full Scanする。
SQL> alter system set db_32k_cache_size=200M; SQL> create tablespace tbs32k datafile 'tbs32k.dbf' size 200M blocksize 32K; SQL> alter table tpc2.stock2 move tablespace tbs32k; SQL> select /* tbs32k */ count(*) from tpc2.stock2; Elapsed: 00:00:10.56
なんか思ったほど速くならない、というか若干遅くなってるくらい。
先週行ったのと同じ手法でv$active_session_historyビューにより、1回のI/O
による最大読込みブロック数を確認する。
(先週のメルマガはこちら↓)
Full Scanを速くしちゃう その2
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 /* tbs32k */ count(*) from tpc2.stock2' order by p3 desc; EVENT P1 P2 P3 ------------------------- ---------- ---------- ---------- db file scattered read 11 5303 2 db file scattered read 11 5087 2 db file scattered read 11 4524 2 db file scattered read 11 4116 2 db file scattered read 11 3579 2 db file scattered read 11 3220 2 db file scattered read 11 2953 2 db file scattered read 11 2366 2 db file scattered read 11 2047 2 db file scattered read 11 3212 2
P3列は読込みブロック数を表す。
db_file_multiblock_read_count=16なのにも関わらず、2ブロックしか読み込
まれていないようだ。
念のためdb_file_multiblock_read_countを大きく設定して再度実行してみる。
◆検証3
db_file_multiblock_read_count=256を設定し、ブロックサイズ=32KBの表領域
に格納されている”TPC2.STOCK2″をFull Scanする。
SQL> alter session set db_file_multiblock_read_count=256; SQL> select /* tbs32k_2 */ count(*) from tpc2.stock2; Elapsed: 00:00:08.96
速くなった。
1I/Oによる読込みブロック数を確認して見る。
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 /* tbs32k_2 */ count(*) from tpc2.stock2' order by p3 desc; EVENT P1 P2 P3 ------------------------- ---------- ---------- ---------- db file scattered read 11 4613 32 db file scattered read 11 1797 32 db file scattered read 11 869 32 db file scattered read 11 261 32 db file scattered read 11 4357 32 db file scattered read 11 69 32 db file scattered read 11 2538 27 db file scattered read 11 459 26 db file scattered read 11 2027 26
1I/Oによる最大読込みブロック数は”32″となり、1I/Oによる最大読込みブロッ
クの上限値”1MB”まで読み込むことができた。
32ブロック * 32KB ブロックサイズ = 1024KB
◆まとめ
マルチブロックサイズの表領域に格納される表をFull Scanした場合、表領域
のブロックサイズ * db_file_multiblock_read_countではなく、
db_block_size * db_file_multiblock_read_count が最大I/Oサイズとなった。
マルチブロックサイズを使用する場合には注意が必要だ。
ビーチサンダルでクール・ビズの茅ヶ崎にて