FC2ブログ

備忘録

SQL*Loader の TRUNCATE

SQL*Loader で TRUNCATE とすると、ロードする前に TRUNCATE してくれるが、セグメント解放してくれなかったので調べた。

SELECT *FROM DBA_SEGMENTS WHERE OWNER = 'XXX' AND SEGMENT_NAME='テーブル名' AND SEGMENT_TYPE='TABLE';


とするとセグメントの情報を取得できる。BYTES や BLOCKS を見れば良い。詳細はマニュアル参照。
TRUNCATE すると、BLOCKS が 1 になるはずだが、そうなっていなかった。
※CREATE TABLE で SEGMENT CREATION DEFERRED を指定していると 0 になると思われる。

SQL*Loader のマニュアルを見ると次のように書いてあった。

TRUNCATEオプションを使用すると、SQLのTRUNCATE TABLE table_name REUSE STORAGE文が実行され、表のエクステントが再利用されます。
TRUNCATEオプションにより、表またはクラスタからすべての行が短時間で効率的に削除されるため、最大限の処理パフォーマンスを実現できます。


TRUNCATE TABLE のデフォルトは DROP STORAGE で、セグメントが解放されるが、REUSE STORAGE だと解放されない。デカイテーブルで DROP STORAGE すると時間がかかる時がある。
それが嫌だから、Loader の TRUNCATE は REUSE STORAGE なのだろうが、オプションで変更できない。

SQL*Loader でセグメント解放したい場合は、事前に TRUNCATE TABLE すべし、ということね。
スポンサーサイト

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://ncdkayak.blog.fc2.com/tb.php/54-0b26ecf0
この記事にトラックバックする(FC2ブログユーザー)

FC2Ad