<div dir="ltr">久保さん<div><br></div><div>成田です。</div><div><br></div><div>考察ありがとうございます。</div><div>ご指摘の通り、1については遅いものではありません。</div><div>1で絞り込んだものに対する2のSQLが遅い、が</div><div>課題となっています。</div><div><br></div><div>なおINSERTコストの考慮も確認しておりますが</div><div>通常のSELECTでも遅い状況です。(2について)</div><div><br></div><div>頂いた観点踏まえまして、SQLの改善、または</div><div>プロシージャなどによる対応の方針で</div><div>進める形にしようかと思います。</div><div>色々とご意見いただきありがとうございました。</div><div><br></div><div>一旦こちらをもってクローズいただければと思います。</div><div>※面白い結果がわかれば共有できればと思います。</div><div><br></div><div><br></div><div class="gmail_extra">以上、よろしくお願いいたします。</div><div class="gmail_extra">--</div><div><br></div><div class="gmail_extra"><div class="gmail_quote">2015年7月30日 22:12 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>
なるほど、シングルDBとRACで違くて、<br>
待てば帰ってくるということで、<br>
処理は進んでて単に時間がかかっていることですね。<br>
<span class=""><br>
&gt; a:10秒以内に返ってくる条件、<br>
&gt; b:10分で返ってくる条件、<br>
&gt; c:30分以上返ってこない条件が確認できました。<br>
</span>&gt; …<br>
&gt; &gt; 処理遅延時間に関しては、実行時の条件句によって変わります。<br>
<br>
条件というのは、マテリアライズドビューの検索のことでしょうか?<br>
<span class="">2.INSERT TEMP_TABLE2 SELECT * FROM TEMP_TABLE1<br>
</span>が遅いという話だったので、<br>
1のビューの条件はあまり関係ないのかなと思ったのですが、<br>
1も遅いのでしょうか?<br>
(2は一時テーブルから一時テーブルのSQLなので、<br>
マテビューの条件が影響すると考えにくいかなと思いまして)<br>
<br>
もし、1も遅い (or 1の方が遅い) のであれば、<br>
単純に SELECT * FROM MV_USER するだけで遅いのかどうか、<br>
試したいところですね。<br>
<br>
&gt; どちらの環境においても、アプリからの実行と<br>
&gt; クライアントツールからの実行で、<br>
&gt; 大きく処理時間が違いました。<br>
<br>
こちら方向性での検証は、お約束の検証方法なのですが、<br>
フレームワークのDataSourceを使って、<br>
JDBCベタに実行してみるといいかと思います。<br>
外だしSQLの execute() メソッドも、<br>
(execute()メソッドを使われていますよね?)<br>
単純にPreparedStatementのexecute()を呼んでいるだけなので、<br>
そこで差が出るとか考えにくいですが、<br>
原因ポイントの切り分けのために。<br>
<br>
&gt; 大幅に改修することは直近は難しいため、<br>
&gt; 影響の少ない改修方法を探しております。<br>
<br>
原因追及が長引いたら回避策として、<br>
プロシージャを作ってアプリからはそれを実行するだけってのも<br>
アリかもしれません。それで速くなるかわかりませんが…<br>
(逆にそれでも遅いとなれば、アプリからのDB接続セッションに<br>
何かしらクライアントツールからの接続と違う点があるのかも)<br>
<div class="HOEnZb"><div class="h5"><br>
<br>
<br>
2015-07-30 21:15 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; お世話になっております。成田です。<br>
&gt; ご確認ありがとうございます。<br>
&gt;<br>
&gt; 頂いた件についてですが、以下ご参照いただけますか。<br>
&gt; 環境など漏れていた点もあり申し訳ありませんが、<br>
&gt; その点加味しても状況は同様です。<br>
&gt; --------------------------------<br>
&gt; o そのSQLはDBFluteの外だしSQLを使って実行している?<br>
&gt; →使っています<br>
&gt;<br>
&gt;  o 30分待てば終わる? (or 永遠に終わりそうにない?)<br>
&gt; →スペックにより差異はありますが<br>
&gt;  環境によっては終わりそうにないとしています。<br>
&gt;  (長時間化する)<br>
&gt;<br>
&gt;  パフォーマンスの悪い環境(シングルDB)では、<br>
&gt;  a:10秒以内に返ってくる条件、<br>
&gt;  b:10分で返ってくる条件、<br>
&gt;  c:30分以上返ってこない条件が確認できました。<br>
&gt;<br>
&gt;  パフォーマンスのよい環境(RAC)では、<br>
&gt;  上記と同じ条件、SQLの場合でそれぞれ、<br>
&gt;  a:2秒で返ってくる、<br>
&gt;  b:20秒で返ってくる、<br>
&gt;  c:2分30秒で返ってくることが確認されました。<br>
&gt;<br>
&gt;  o 何度実行しても必ず遅い?<br>
&gt; →遅い<br>
&gt;<br>
&gt;  o どの環境でも再現する?<br>
&gt; →パフォーマンスがよい環境では、<br>
&gt;  20秒でレスポンスが返ってくることが確認されました。<br>
&gt;  ただし、クライアントツールでは同様のDBに対して、<br>
&gt;  該当のSQLでデータを抽出するまで、<br>
&gt;  2秒で取得できることが確認されました。<br>
&gt;  どちらの環境においても、アプリからの実行と<br>
&gt;  クライアントツールからの実行で、<br>
&gt;  大きく処理時間が違いました。<br>
&gt;<br>
&gt;&gt;処理が遅いのか、ロック待ちしているのか、<br>
&gt;&gt;で全然解決方法が違うと思うので、<br>
&gt;&gt;とりあえずこのへんの情報を整理できるといいかと。<br>
&gt; ロック待ちはない認識です。<br>
&gt; 単純にSQL発行を単独実施しているため。<br>
&gt; OracleのV$LOCK内には、常に実行しているSQLが1つだけ、<br>
&gt; 滞納していることを確認しております。<br>
&gt; 処理遅延時間に関しては、実行時の条件句によって変わります。<br>
&gt;<br>
&gt;&gt;あと、1と2でトランザクションを分けるとどうなるか?<br>
&gt;&gt;とかの検証にしてみたいところですね。<br>
&gt; 1と2のトランザクションですが、一時テーブルを使っているため、<br>
&gt; 分割をすることができません。<br>
&gt; 大幅に改修することは直近は難しいため、<br>
&gt; 影響の少ない改修方法を探しております。<br>
&gt;<br>
&gt;<br>
&gt; 以上、よろしくお願いいたします。<br>
&gt; --<br>
&gt;<br>
&gt; 2015年7月30日 15:51 kubo &lt;<a href="mailto:dbflute@gmail.com">dbflute@gmail.com</a>&gt;:<br>
&gt;&gt;<br>
&gt;&gt; 久保(jflute)です<br>
&gt;&gt;<br>
&gt;&gt; 成田さん、こんにちは<br>
&gt;&gt;<br>
&gt;&gt; 色々と登場人物が多いので、<br>
&gt;&gt; まずはちょっと状況の整理からできればと。<br>
&gt;&gt;<br>
&gt;&gt; &gt; 2.INSERT TEMP_TABLE2 SELECT * FROM TEMP_TABLE1 ;(※)<br>
&gt;&gt; &gt;    (処理件数123391件)<br>
&gt;&gt;<br>
&gt;&gt; このSQLを、アプリケーションの中から、<br>
&gt;&gt; 実行したら30分かかったということでしょうか?<br>
&gt;&gt;  o そのSQLはDBFluteの外だしSQLを使って実行している?<br>
&gt;&gt;  o 30分待てば終わる? (or 永遠に終わりそうにない?)<br>
&gt;&gt;  o 何度実行しても必ず遅い?<br>
&gt;&gt;  o どの環境でも再現する?<br>
&gt;&gt;<br>
&gt;&gt; 処理が遅いのか、ロック待ちしているのか、<br>
&gt;&gt; で全然解決方法が違うと思うので、<br>
&gt;&gt; とりあえずこのへんの情報を整理できるといいかと。<br>
&gt;&gt;<br>
&gt;&gt; あと、1と2でトランザクションを分けるとどうなるか?<br>
&gt;&gt; とかの検証にしてみたいところですね。<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; 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;&gt; &gt; お世話になります。成田と申します。<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; 以前はOracleのLikeSearchの件でお世話になりました。<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; 今回、dbfluteを利用しているアプリにて<br>
&gt;&gt; &gt; 気になる事象がありましたので<br>
&gt;&gt; &gt; 何か知見ありましたらご教授いただけますと幸いです。<br>
&gt;&gt; &gt; ------------------------------------------------------------------------<br>
&gt;&gt; &gt; ■環境<br>
&gt;&gt; &gt;  java:jdk1.7.0_51<br>
&gt;&gt; &gt;  tomcat:7.0<br>
&gt;&gt; &gt;  framework:Spring Framework 3.2.8.RELEASE<br>
&gt;&gt; &gt;  DB:Oracle Database 11g Release 11.2.0.3.0 - 64bit Production<br>
&gt;&gt; &gt;  O/Rマッパー:dbflute<br>
&gt;&gt; &gt;  jdbc:ojdbc7-12.1.0.1.0.jar<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; ■概要<br>
&gt;&gt; &gt;  Webアプリケーション上の一部の処理で、<br>
&gt;&gt; &gt;  パフォーマンスが極端に悪い事象が確認されました。<br>
&gt;&gt; &gt;  該当の処理は、1度のSQLで実行すると非常に動作が遅いため、<br>
&gt;&gt; &gt;  一時テーブルを利用し、<br>
&gt;&gt; &gt;  いくつかの処理に分解して実行しています。<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; ■事象<br>
&gt;&gt; &gt;  同一Transaction内で、OracleのGLOBAL TEMPORARY TABLEを利用し、<br>
&gt;&gt; &gt;  以下のような処理をしております。<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; ------------------------------------------------<br>
&gt;&gt; &gt;  1.INSERT TEMP_TABLE1 SELECT * FROM MV_USER ;(※)<br>
&gt;&gt; &gt;    (処理件数143170件)<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;  2.INSERT TEMP_TABLE2 SELECT * FROM TEMP_TABLE1 ;(※)<br>
&gt;&gt; &gt;    (処理件数123391件)<br>
&gt;&gt; &gt;  ・・・・・・<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;  ※各テーブル名は以下の表またはビューとなります。<br>
&gt;&gt; &gt;   TEMP_TABLE1:GLOBAL TEMPORARY TABLE<br>
&gt;&gt; &gt;   TEMP_TABLE2:GLOBAL TEMPORARY TABLE<br>
&gt;&gt; &gt;   MV_USER:MATERIALIZED VIEW<br>
&gt;&gt; &gt; ------------------------------------------------<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;  上記の場合、アプリケーションから2のSQLを実行した所、<br>
&gt;&gt; &gt;  パフォーマンスが悪くDBに滞納が確認されました。<br>
&gt;&gt; &gt;  sys権限でV$LOCK内のロック時間を確認すると<br>
&gt;&gt; &gt;  30分以上、滞納していることが確認できました。<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;  一方、同様のSQLをOracleのクライアントツール(Osqledit:odbc)を<br>
&gt;&gt; &gt;  用いて実行すると、約2秒ほどで1、2のSQLを実施できました。<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; ■補足<br>
&gt;&gt; &gt;  jdbc、odbcによる影響もあるかとしツールでの差異を確認しましたが<br>
&gt;&gt; &gt;  SQLDeveloper(jdbc)でも処理が早いことを確認しております。<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; 本件の原因、理由が特定できていないため、<br>
&gt;&gt; &gt; 過去の事例や、どういった原因が考えられるか<br>
&gt;&gt; &gt; アドバイスを頂けますでしょうか。<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; 以上、よろしくお願いいたします。<br>
&gt;&gt; &gt; --<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; _______________________________________________<br>
&gt;&gt; &gt; Seasar-user mailing list<br>
&gt;&gt; &gt; <a href="mailto:Seasar-user@ml.seasar.org">Seasar-user@ml.seasar.org</a><br>
&gt;&gt; &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;&gt; &gt;<br>
&gt;&gt; _______________________________________________<br>
&gt;&gt; Seasar-user mailing list<br>
&gt;&gt; <a href="mailto:Seasar-user@ml.seasar.org">Seasar-user@ml.seasar.org</a><br>
&gt;&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>
&gt;<br>
&gt;<br>
&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>
</div></div></blockquote></div><br></div></div>