[Seasar-user:22078] Re: 実行環境によるSQL処理の差異について

kubo [E-MAIL ADDRESS DELETED]
2015年 7月 30日 (木) 22:12:47 JST


久保(jflute)です

なるほど、シングルDBとRACで違くて、
待てば帰ってくるということで、
処理は進んでて単に時間がかかっていることですね。

> a:10秒以内に返ってくる条件、
> b:10分で返ってくる条件、
> c:30分以上返ってこない条件が確認できました。
>> > 処理遅延時間に関しては、実行時の条件句によって変わります。

条件というのは、マテリアライズドビューの検索のことでしょうか?
2.INSERT TEMP_TABLE2 SELECT * FROM TEMP_TABLE1
が遅いという話だったので、
1のビューの条件はあまり関係ないのかなと思ったのですが、
1も遅いのでしょうか?
(2は一時テーブルから一時テーブルのSQLなので、
マテビューの条件が影響すると考えにくいかなと思いまして)

もし、1も遅い (or 1の方が遅い) のであれば、
単純に SELECT * FROM MV_USER するだけで遅いのかどうか、
試したいところですね。

> どちらの環境においても、アプリからの実行と
> クライアントツールからの実行で、
> 大きく処理時間が違いました。

こちら方向性での検証は、お約束の検証方法なのですが、
フレームワークのDataSourceを使って、
JDBCベタに実行してみるといいかと思います。
外だしSQLの execute() メソッドも、
(execute()メソッドを使われていますよね?)
単純にPreparedStatementのexecute()を呼んでいるだけなので、
そこで差が出るとか考えにくいですが、
原因ポイントの切り分けのために。

> 大幅に改修することは直近は難しいため、
> 影響の少ない改修方法を探しております。

原因追及が長引いたら回避策として、
プロシージャを作ってアプリからはそれを実行するだけってのも
アリかもしれません。それで速くなるかわかりませんが…
(逆にそれでも遅いとなれば、アプリからのDB接続セッションに
何かしらクライアントツールからの接続と違う点があるのかも)



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


Seasar-user メーリングリストの案内