
こんにちわ。
日次処理として、毎晩ワークテーブルをTruncateしてInsertしなおすというプログラムを数年前に作りました。
このプログラムはVB6、ADO、OLE DBプロバイダはOracleのものを使っています。
他のテーブルからSelectし、それを元に1レコードずつInsert文を作っては実行を繰り返す処理で正直遅いのですが、このプログラムの動作が不思議です。
日々数十万件のInsertを行っているのですが、ログを確認すると最初の2万件のInsertには40分掛かるわりに最後の2万件は5分で終わるのです。
今まで処理時間の遅さが問題になることもなく、バグもなく動いているしであまり気にしていなかったのですが、最近なぜこのような動きになるのか気になってきました。
最初も最後もSelect結果に偏りはなく、Insert文を作る処理に掛かっている時間は同じようなものかと思います。
とすると、遅いのはDBでのInsert処理か?と考えています。
レコード件数が少ないうちのInsertには時間が掛かるものなんでしょうか?
だとするとそれはなぜ?
別に処理速度を速くしたいとか言うことではなく、なぜInsertの処理時間にこれほどの差が生じるのかが気になっています。
なおこのテーブルは主キー以外に索引を作っていません。
Insert文を作る際の元になるデータは論理的な単位ごとにSelectします。1回がだいたい数十件ぐらいです。
またその論理的な単位の分のデータをInsertしおわるごとにcommitしています(数十件ごとのcommitになります)。
No.1ベストアンサー
- 回答日時:
テーブルの拡張が起きているんではないでしょうか。
storageサイズの指定を確認してみてください。
もしそれなら最終的に拡張されるサイズくらいの大きさでテーブル切り直しておくといいです。
ご回答ありがとうございました。
現在StorageはInitial 64K、Next 0Kという設定になっていました。
このテーブルに割り当てられているExtentを確認したら、実にExtent総数97、サイズ合計216MBという状態でした。
Extentのサイズは最初のうちは64K、そのうち1M、やがて8Mと増えていくようで、これだと確かにレコード件数が増えていくとInsert処理の速度が上がっていくことの説明がつきます。
テスト環境が構築でき次第、StorageのInitialを大きく設定して一度試してみようと思います。
No.2
- 回答日時:
テーブルの動的拡張では?
テーブルの初期時のExtentの数と最大データ時のExtent数の違いが気になります。
データを入れるたびに領域が足りなくExtentが割り当てられつづける。そして、2万件Insertした時点で増分サイズの設定で全件収まるだけのサイズに拡張されているような気がします。
Insert時にdba_extentsを監視してみると良いでしょう。
あと、該当表領域の管理方式がどちらなのかも気になります。
・ディクショナリ管理表領域
・ローカル管理表領域
ディクショナリ管理だとExtentの割り当ての負荷が高いので、
当てはまる可能性は高いです。
Storageを見直すか、Truncateを「REUSE STORAGE」付きで実行してExtentの開放を行わないのもひとつの手です。
ご回答ありがとうございました。
Extentの分かりやすい解説、助かります。
ちなみに表領域はLocalですが、それでもデータ量に対してStorageのInitial設定が小さすぎるのかも。
「Truncate ~ Reuse Storage」という方法もあるんですね~。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
データを削除しても表領域の使...
-
ORA-00959: 表領域'****'は...
-
Data Pump で大量データインポ...
-
Oracleはどの程度まで巨大なテ...
-
データ削除の方法
-
運用中のALTER TABLE
-
表領域の使用率がもうすぐ100%
-
表領域(users)の中身を整理したい
-
NEXT EXTENTのサイズが0
-
データファイル情報について
-
Viewにインデックスは張れ...
-
CLOB型へのINSERT
-
datapumpの実行方法について
-
PL/SQLでの処理について
-
RDBのテーブル種類の違い
-
2つのACCESSファイルからデー...
-
oracleのimpdpでORA-39166
-
ACCESS 複数テーブル・複数フィ...
-
イラストのデータ入稿について...
-
トランザクションの考え方の疑問点
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
データを削除しても表領域の使...
-
ORA-00959: 表領域'****'は...
-
Data Pump で大量データインポ...
-
TruncateしたテーブルへのInser...
-
表領域の使用率がもうすぐ100%
-
oracle SYSTEM01.DBF が大きい
-
テーブルのSTORAGE句のサイズ設定
-
データ削除の方法
-
Oracleはどの程度まで巨大なテ...
-
ORACLEでの領域計算
-
create table時のINITIALとMAXE...
-
USER_SEGMENTの参照について
-
表領域(users)の中身を整理したい
-
データベースの初期サイズ
-
INDEX 見積もりについて
-
Oracle8i ストアドプロ...
-
PROCのFETCH結果にごみが。。
-
dba_extentsの考え方について
-
運用中のALTER TABLE
-
SYSTEM表領域にインポー...
おすすめ情報