- PR -

INSERT/SELECTを発行すると返ってこない!

1
投稿者投稿内容
つんきち
会議室デビュー日: 2004/03/19
投稿数: 15
投稿日時: 2006-04-14 22:03
こんにちわ。つんきちと言います。

PL/SQLにて、
INSERT/SELECT文で5000件ほどのデータを
挿入しようとすると全く返ってきません。
しかし、カーソルを用いて、FOR文でINSERTするように
変更すると20分ぐらいで返ってきました。
統計をみると、SELECTをする所では、コストがかかってません。
となるとINSERT時に時間がかかっていると思われるのですが、
どういう原因が考えられるのでしょうか?

また、確認すべき事があれば、教えて下さい。
よろしくお願いします。


せん
ぬし
会議室デビュー日: 2002/03/04
投稿数: 397
投稿日時: 2006-04-15 01:23
差し障りのない程度に、変更前と変更後のコードを提示してもらえませんか?
つんきち
会議室デビュー日: 2004/03/19
投稿数: 15
投稿日時: 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 ]
Desmo
大ベテラン
会議室デビュー日: 2004/03/24
投稿数: 149
投稿日時: 2006-04-19 12:01
カーソルを用いた結果の20分だって、決して速いとは言えないですよね。(データにもよりますが・・・)
単純にデータベースの障害ということはないですか?
ALRTログに何かエラーが出ているとか、CPU負荷率が異常に高くなっているとか・・・
それから、
> 全く返ってきません。
っていうのもなんか気持ちが悪いので、件数を減らして(100件くらいにして)再度計測されてみては如何でしょうか?
今川 美保(夏椰)
ぬし
会議室デビュー日: 2004/06/10
投稿数: 363
お住まい・勤務地: 神奈川県茅ヶ崎市
投稿日時: 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

スキルアップ/キャリアアップ(JOB@IT)