こんにちわ。
日次処理として、毎晩ワークテーブルを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で質問しましょう!
似たような質問が見つかりました
- MySQL 次の時間帯の勝率の合計を求めるSQL文 1 2023/07/04 17:12
- MySQL 下の画像はSQLの4大命令の性質をまとめたものであるらしいです UPDATE INSERT DELE 1 2023/06/07 15:36
- MySQL mysqlで INSERT と SELECTの用途は 1 2022/04/01 00:45
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- PHP php エラー 3 2022/11/18 23:32
- Access(アクセス) access,vbaでフォルダ内のファイルをテーブルにインポート、ファイル名もフィールドに追加したい 1 2022/08/31 11:11
- PHP プログラムコードを入力する場合改行してもいいですか? 2 2022/10/02 16:05
- SQL Server AccessのInsertクエリのあとつづけてDeleteクエリを行いたいがSQLでどう書いたらいい 3 2023/05/27 14:12
- その他(プログラミング・Web制作) VSCodeで上書きモードにならない 1 2022/10/26 12:10
- 工学 お金を入れるとInsertキーが押される機械の作り方を教えてください。 1 2022/12/16 18:20
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
データを削除しても表領域の使...
-
ORA-00959: 表領域'****'は...
-
データ削除の方法
-
データベースの初期サイズ
-
oracle SYSTEM01.DBF が大きい
-
テーブルのSTORAGE句のサイズ設定
-
Data Pump で大量データインポ...
-
データファイルの縮小
-
オーバーヘッドってなんですか?
-
表領域の違うEXPORT IMPORT
-
TruncateしたテーブルへのInser...
-
Viewにインデックスは張れ...
-
異なるスキーマからデータを抽...
-
CLOB型へのINSERT
-
DELETE文でFROM句を省略した場合
-
Access レコードを追加できませ...
-
ACCESS 複数テーブル・複数フィ...
-
datapumpの実行方法について
-
postgreSQLのint型は桁数指定が...
-
他の処理でselectさせないよう...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
データを削除しても表領域の使...
-
ORA-00959: 表領域'****'は...
-
Data Pump で大量データインポ...
-
表領域の使用率がもうすぐ100%
-
テーブルのSTORAGE句のサイズ設定
-
oracle SYSTEM01.DBF が大きい
-
データベースの初期サイズ
-
INDEX 見積もりについて
-
Oracleはどの程度まで巨大なテ...
-
データ削除の方法
-
create table時のINITIALとMAXE...
-
TruncateしたテーブルへのInser...
-
表領域の違うEXPORT IMPORT
-
UNDO_RETENTION初期化パラメー...
-
表領域(users)の中身を整理したい
-
オーバーヘッドってなんですか?
-
データファイル情報について
-
ORACLEでの領域計算
-
CreateTable時のInitialエクス...
-
エクステント数
おすすめ情報