【Oracle】DataPumpのパフォーマンス改善

※本記事は10g以降が前提となります。

データ量が大して増えたわけでもないのに、
DataPump(expdp/impdp)のパフォーマンスが落ちた場合、
対象テーブルをselectするSQLと処理が競合しているか、
そうでなければ、SGAの中のStreamsプールという
メモリ領域の割り当てが小さすぎるのが原因であることが多い。

表領域に余裕があっても、
メモリ領域の割当が十分でないと
メモリに展開する際のI/Oが多発してパフォーマンスが劣化する。

【確認方法】
show parameters streams_pool_size


※デフォルト(0)の場合、共有プールの10%が自動割当。
show parameters shared_pool_size
※共有プールもデフォルトの場合、
 SGA→共有プール→Streamsプールで自動割当。
※各メモリの割当状況は、v$sgainfoで確認可能。
select * from v$sgainfo;


【変更方法】
alter system set streams_pool_size=10M;


【備忘記録】
1. alter文はすぐに返ってこない。
  割り当て容量にもよるのだろうが、10MBなら5~10分は覚悟。
2. alter文の結果が返ってきた後、
  show parameters で確認しても直ぐには反映されない
 (どのタイミングで反映されるかは不明)
3. 10Mと指定したのに16Mになっている※。

※GranuleSize(グラニュルサイズ)単位での割当によるもの。
v$sgainfoで確認可能。
SGAが1GBより小さい場合4MB、1GB以上だと16MB刻み。