- - PR -
INSERT/SELECTを発行すると返ってこない!
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2006-04-14 22:03
こんにちわ。つんきちと言います。
PL/SQLにて、 INSERT/SELECT文で5000件ほどのデータを 挿入しようとすると全く返ってきません。 しかし、カーソルを用いて、FOR文でINSERTするように 変更すると20分ぐらいで返ってきました。 統計をみると、SELECTをする所では、コストがかかってません。 となるとINSERT時に時間がかかっていると思われるのですが、 どういう原因が考えられるのでしょうか? また、確認すべき事があれば、教えて下さい。 よろしくお願いします。 |
|
投稿日時: 2006-04-15 01:23
差し障りのない程度に、変更前と変更後のコードを提示してもらえませんか?
|
|
投稿日時: 2006-04-15 11:13
返信ありがとうございます。
すいません、下記の変更前と変更後では、何か違いがあるのでしょうか? また、INSERTが遅い場合、注意しなければいけない所があるのでしょうか? (PGAのサイズ、表領域の設定等) 【変更前】 PROCEDURE P_XXX処理 IS BEGIN INSERT INTO A ( 項目 ・ ・ ・ ) SELECT 項目 ・ ・ ・ FROM B ; EXCEPTION WHEN OTHERS THEN END P_XXX処理; 【変更後】 PROCEDURE P_XXX処理 IS CURSOR cr_AAAA IN SELECT 項目 ・ ・ ・ FROM B re_AAAA cr_AAAA%ROWTYPE; BEGIN OPEN cr_AAAA; LOOP FETCH cr_AAAA INTO re_AAAA; -- データがなければ終了 EXIT WHEN cr_AAAA%NOTFOUND; INSERT INTO B ( 項目 ・ ・ ・ )VALUES( 項目 ・ ・ ・ ); END LOOP; EXCEPTION WHEN OTHERS THEN END P_XXX処理; [ メッセージ編集済み 編集者: つんきち 編集日時 2006-04-15 11:46 ] |
|
投稿日時: 2006-04-19 12:01
カーソルを用いた結果の20分だって、決して速いとは言えないですよね。(データにもよりますが・・・)
単純にデータベースの障害ということはないですか? ALRTログに何かエラーが出ているとか、CPU負荷率が異常に高くなっているとか・・・ それから、 > 全く返ってきません。 っていうのもなんか気持ちが悪いので、件数を減らして(100件くらいにして)再度計測されてみては如何でしょうか? |
|
投稿日時: 2006-04-19 13:26
きっちり追求しきれていないですが、
状況判断の情報になれば・・・ #以下の操作は Oracle10gExpressで行ってみました。 DB起動直後に Insert Into Selectでレコード追加した場合は PL/SQLでレコード追加したときよりも、ディスクアクセスなどは少ないです。 #どちらの処理も、起動直後の状態で実行した場合。 がっ、起動したままの状態(再起動や停止・起動をしていないという状態)で 繰り返して見ていくと、そのうちInsert Into Selectの方がディスクアクセスが多くなったりしますね。 起動直後でも、繰り返し行っている場合でも Insert Into Select と PL/SQLでバッファヒット率には差があまり出なかった・・・。 5千行の追加が20分とかってオーダーって 行長がかなり長いのかしら?って思ったんですが、 どれぐらいなんでしょうね? とりあえず 1レコードが約4Kで実験してみていますけど・・・。 |
1