4 Replies Latest reply: Nov 8, 2011 11:09 PM by 896439 RSS

    PLSQL内のループ処理速度の低下

    896439
      初めて投稿します。

      現在、旧サーバーから、新サーバーへのオラクルの移行を行っています。
      テーブルの構成はそのままで、export importで構築してあります。
      新サーバで動作確認をしていたところ、PLSQLの処理が異様に遅くなっていることに気がつきました。
      旧環境では、2時間以内で終わる処理が新環境ですと6時間程度かかります。
      サーバーの性能に関しては、新サーバーの方が、高性能のため、新サーバーの処理速度が向上すると
      思っていたのですが、実際には3倍程度時間がかかるようになってしまい困惑しております。
      新環境のPLSQL内のSQLを一つ一つ、実行計画を確認したのですが旧環境と同等でした。
      ただ、気になる点として、PLSQL内で同一処理をループしているのですが、ループ開始直後は、新環境の処理速度は高速(0.003秒/1件)なのですが、
      件数を重ねるごとに処理速度が低下(0.2秒/1件)していました。旧環境では、処理速度の著しい低下は見受けられませんでした。
      ※処理速度の調査は同一データ・条件で実施しております。
      オラクルのバージョンにつきましては以下の通りです。
      旧環境:11.1.0.7.0
      新環境:11.2.0.2.0
      PLSQL内の処理は、
      ①メインテーブルを検索しカーソルに設定(約30万件)
      ②カーソルループ処理
      ③ループ内で、サブテーブル(5)検索→検索したデータを編集→登録用テーブル(1)に登録処理を行っています。
      ここで質問なのですが、ループするごとに処理速度が低下する原因はどのようなことが考えられますでしょうか?
      ご存知の方はご教授ください。よろしくお願いいたします。
      ※新環境、旧環境のバージョンが誤っていましたので修正しました。

      Edited by: user10610537 on 2011/10/27 0:09

      Edited by: user10610537 on 2011/10/27 0:11
        • 1. Re: PLSQL内のループ処理速度の低下
          896440
          新環境の方がバージョンが古くなったんでしょうか?
          適当に思いつくものを上げます。

          ・新環境のメモリが少なくなっているためスワップが発生している
          ・新環境でPLSQLをリコンパイルしていない
          ・新環境で索引をリビルドしていない
          ・旧環境ではインデックスが使用されていたが、新環境ではインデックスが使用されていない
           (徐々に遅くなっているところを見ると、これは無いか・・?)
          • 2. Re: PLSQL内のループ処理速度の低下
            896439
            返信ありがとうございます
            以下2点について、リコンパイル・リビルド等を行いましたが、結果は変わりませんでした。
            ・新環境でPLSQLをリコンパイルしていない
            ・新環境で索引をリビルドしていない

            ・新環境のメモリが少なくなっているためスワップが発生している
            こちらも調査しましたが、soralis上のメモリの空き領域は十分にありスワップはしていないようです。

            ・旧環境ではインデックスが使用されていたが、新環境ではインデックスが使用されていない
            ループ内の同一処理で、初期は、インデックスを使用して、後半でインデックスを使用しないということはありえますでしょうか?

            また何か気になる点等ありましたら、ご指摘ください
            よろしくお願いします

            Edited by: user10610537 on 2011/10/27 17:50
            • 3. Re: PLSQL内のループ処理速度の低下
              Takashi Matsuoka
              Statspackを取得して、環境によって
              consistent gets
              physical reads
              physical writes
              redo size
              に大幅な差異が無いか確認できませんか?

              また、ハードが違うようであれば、iostatでデータ転送速度や転送量も確認したほうが良いです。
              • 4. Re: PLSQL内のループ処理速度の低下
                896439
                返信ありがとうございます。
                原因が大体判明しましたので、ご報告します。
                原因は以下の通りです。
                1.旧環境と、新環境では、ネットワークの構成が異なっていたた。
                  旧環境は、社内LAN、新環境は外部ネットワークに接続されていた
                2.PLSQLの実行を、クライアントから実行していた。

                クライアントからPLSQLを実行した場合、処理中にクライアントと、サーバー側で何かしら通信されていてそれで処理速度が低下するようです。
                旧環境では、サーバーと、クライアントが近かったため、遅延を感じなかっただけのようです。

                サーバー側でシェルからPLSQLを実行するようにしたところ、本来の処理速度で処理が完了することがわかりました。

                回答していだたいた皆様、ご迷惑をおかけしました