<div dir="ltr">久保さん<div><br></div><div>お世話になっております。成田です。</div><div>ご確認ありがとうございます。</div><div><br></div><div>頂いた件についてですが、以下ご参照いただけますか。</div><div>環境など漏れていた点もあり申し訳ありませんが、</div><div>その点加味しても状況は同様です。</div><div>--------------------------------</div><div><div>o そのSQLはDBFluteの外だしSQLを使って実行している?</div><div>→使っています</div><div><br></div><div> o 30分待てば終わる? (or 永遠に終わりそうにない?)</div><div>→スペックにより差異はありますが</div><div> 環境によっては終わりそうにないとしています。</div><div> (長時間化する)<br></div><div><br></div><div> パフォーマンスの悪い環境(シングルDB)では、</div><div> a:10秒以内に返ってくる条件、</div><div> b:10分で返ってくる条件、</div><div> c:30分以上返ってこない条件が確認できました。</div><div><br></div><div> パフォーマンスのよい環境(RAC)では、</div><div> 上記と同じ条件、SQLの場合でそれぞれ、</div><div> a:2秒で返ってくる、<br></div><div> b:20秒で返ってくる、</div><div> c:2分30秒で返ってくることが確認されました。</div><div><br></div><div> o 何度実行しても必ず遅い?</div><div>→遅い</div><div><br></div><div> o どの環境でも再現する?</div><div>→パフォーマンスがよい環境では、</div><div> 20秒でレスポンスが返ってくることが確認されました。</div><div> ただし、クライアントツールでは同様のDBに対して、</div><div> 該当のSQLでデータを抽出するまで、</div><div> 2秒で取得できることが確認されました。</div><div> どちらの環境においても、アプリからの実行と</div><div> クライアントツールからの実行で、</div><div> 大きく処理時間が違いました。</div><div><br></div><div>&gt;処理が遅いのか、ロック待ちしているのか、</div><div>&gt;で全然解決方法が違うと思うので、</div><div>&gt;とりあえずこのへんの情報を整理できるといいかと。</div><div>ロック待ちはない認識です。</div><div>単純にSQL発行を単独実施しているため。</div><div>OracleのV$LOCK内には、常に実行しているSQLが1つだけ、</div><div>滞納していることを確認しております。</div><div>処理遅延時間に関しては、実行時の条件句によって変わります。</div><div><br></div><div>&gt;あと、1と2でトランザクションを分けるとどうなるか?</div><div>&gt;とかの検証にしてみたいところですね。</div><div>1と2のトランザクションですが、一時テーブルを使っているため、</div><div>分割をすることができません。</div><div>大幅に改修することは直近は難しいため、<br></div><div>影響の少ない改修方法を探しております。</div></div><div class="gmail_extra"><br></div><div class="gmail_extra"><br></div><div class="gmail_extra">以上、よろしくお願いいたします。</div><div class="gmail_extra">--</div><div class="gmail_extra"><br><div class="gmail_quote">2015年7月30日 15:51 kubo <span dir="ltr">&lt;<a href="mailto:dbflute@gmail.com" target="_blank">dbflute@gmail.com</a>&gt;</span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">久保(jflute)です<br>
<br>
成田さん、こんにちは<br>
<br>
色々と登場人物が多いので、<br>
まずはちょっと状況の整理からできればと。<br>
<span class=""><br>
&gt; 2.INSERT TEMP_TABLE2 SELECT * FROM TEMP_TABLE1 ;(※)<br>
&gt;    (処理件数123391件)<br>
<br>
</span>このSQLを、アプリケーションの中から、<br>
実行したら30分かかったということでしょうか?<br>
 o そのSQLはDBFluteの外だしSQLを使って実行している?<br>
 o 30分待てば終わる? (or 永遠に終わりそうにない?)<br>
 o 何度実行しても必ず遅い?<br>
 o どの環境でも再現する?<br>
<br>
処理が遅いのか、ロック待ちしているのか、<br>
で全然解決方法が違うと思うので、<br>
とりあえずこのへんの情報を整理できるといいかと。<br>
<br>
あと、1と2でトランザクションを分けるとどうなるか?<br>
とかの検証にしてみたいところですね。<br>
<div><div class="h5"><br>
<br>
2015-07-30 15:00 GMT+09:00 Nari &lt;<a href="mailto:trickster.m.3@gmail.com">trickster.m.3@gmail.com</a>&gt;:<br>
&gt; お世話になります。成田と申します。<br>
&gt;<br>
&gt; 以前はOracleのLikeSearchの件でお世話になりました。<br>
&gt;<br>
&gt; 今回、dbfluteを利用しているアプリにて<br>
&gt; 気になる事象がありましたので<br>
&gt; 何か知見ありましたらご教授いただけますと幸いです。<br>
&gt; ------------------------------------------------------------------------<br>
&gt; ■環境<br>
&gt;  java:jdk1.7.0_51<br>
&gt;  tomcat:7.0<br>
&gt;  framework:Spring Framework 3.2.8.RELEASE<br>
&gt;  DB:Oracle Database 11g Release 11.2.0.3.0 - 64bit Production<br>
&gt;  O/Rマッパー:dbflute<br>
&gt;  jdbc:ojdbc7-12.1.0.1.0.jar<br>
&gt;<br>
&gt; ■概要<br>
&gt;  Webアプリケーション上の一部の処理で、<br>
&gt;  パフォーマンスが極端に悪い事象が確認されました。<br>
&gt;  該当の処理は、1度のSQLで実行すると非常に動作が遅いため、<br>
&gt;  一時テーブルを利用し、<br>
&gt;  いくつかの処理に分解して実行しています。<br>
&gt;<br>
&gt; ■事象<br>
&gt;  同一Transaction内で、OracleのGLOBAL TEMPORARY TABLEを利用し、<br>
&gt;  以下のような処理をしております。<br>
&gt;<br>
&gt; ------------------------------------------------<br>
&gt;  1.INSERT TEMP_TABLE1 SELECT * FROM MV_USER ;(※)<br>
&gt;    (処理件数143170件)<br>
&gt;<br>
&gt;  2.INSERT TEMP_TABLE2 SELECT * FROM TEMP_TABLE1 ;(※)<br>
&gt;    (処理件数123391件)<br>
&gt;  ・・・・・・<br>
&gt;<br>
&gt;  ※各テーブル名は以下の表またはビューとなります。<br>
&gt;   TEMP_TABLE1:GLOBAL TEMPORARY TABLE<br>
&gt;   TEMP_TABLE2:GLOBAL TEMPORARY TABLE<br>
&gt;   MV_USER:MATERIALIZED VIEW<br>
&gt; ------------------------------------------------<br>
&gt;<br>
&gt;  上記の場合、アプリケーションから2のSQLを実行した所、<br>
&gt;  パフォーマンスが悪くDBに滞納が確認されました。<br>
&gt;  sys権限でV$LOCK内のロック時間を確認すると<br>
&gt;  30分以上、滞納していることが確認できました。<br>
&gt;<br>
&gt;  一方、同様のSQLをOracleのクライアントツール(Osqledit:odbc)を<br>
&gt;  用いて実行すると、約2秒ほどで1、2のSQLを実施できました。<br>
&gt;<br>
&gt; ■補足<br>
&gt;  jdbc、odbcによる影響もあるかとしツールでの差異を確認しましたが<br>
&gt;  SQLDeveloper(jdbc)でも処理が早いことを確認しております。<br>
&gt;<br>
&gt; 本件の原因、理由が特定できていないため、<br>
&gt; 過去の事例や、どういった原因が考えられるか<br>
&gt; アドバイスを頂けますでしょうか。<br>
&gt;<br>
&gt;<br>
&gt; 以上、よろしくお願いいたします。<br>
&gt; --<br>
&gt;<br>
</div></div>&gt; _______________________________________________<br>
&gt; Seasar-user mailing list<br>
&gt; <a href="mailto:Seasar-user@ml.seasar.org">Seasar-user@ml.seasar.org</a><br>
&gt; <a href="https://ml.seasar.org/mailman/listinfo/seasar-user" rel="noreferrer" target="_blank">https://ml.seasar.org/mailman/listinfo/seasar-user</a><br>
&gt;<br>
_______________________________________________<br>
Seasar-user mailing list<br>
<a href="mailto:Seasar-user@ml.seasar.org">Seasar-user@ml.seasar.org</a><br>
<a href="https://ml.seasar.org/mailman/listinfo/seasar-user" rel="noreferrer" target="_blank">https://ml.seasar.org/mailman/listinfo/seasar-user</a><br>
</blockquote></div><br></div></div>