• 締切済み

Oracle SQL実行時間について

Oracle初心者です。 あるテーブル(レコード数:100万件程度)に対してSelectするSQLの実行時間を、Oracleのset timing on, set autotrace onlyで計測しました。 結果は1000ms程度だったのですが、 同じSQL文を実行するプログラム(java)を作成し、pstmt.executequery()してresultsetからデータをgetするまでの時間をログに出力させたところ、400ms程度でした。 プログラムの性能目標として、set timing on の値を設定していたため、実際の結果(javaプログラムが出力した処理時間)の評価に困っています。 差がでる原因をご教示いただけませんでしょうか。 宜しくお願いします。

  • Oracle
  • 回答数1
  • ありがとう数0

みんなの回答

  • f_onion
  • ベストアンサー率47% (10/21)
回答No.1

パッと思いつくのでは以下です。 ・全く同等のSQLであれば、SQL解析時間 ・結果がキャッシュされるため。 ・実行計画の出力結果を生成する時間 キャッシュがクリアされるようにした上で再度実行したほうがいいでしょうね。 (あるのかどうかわかりませんがデータベースかインスタンスの再起動してみるといいかもしれません) いずれにしても複数回(10回程度)実行して、平均値を取ったほうがいいでしょう。 一番大きい値と一番小さい値を除いた平均や 一番最初と一番最後を除いた平均も 用意しておくといいでしょうね。 最大値、最小値もそれはそれで評価します。

baum0407
質問者

補足

さっそくのご回答ありがとうございます。 上記結果は、複数回実行した結果となります。 通常運用時の実行時間を評価対象としたかったため、キャッシュされている状態、解析を全て完了した状態で計測しようと思ってました。 気になっているのは、転送時間を含むか否かのような気がしています。(根拠はないのですが…) javaプログラムの方は、転送と処理を並行してやっているのでは?と。。。

関連するQ&A

  • JavaでのSQL文の実行について

    JavaでのSQL文の実行について Class.forName("org.gjt.mm.mysql.Driver"); con = DriverManager.getConnection("jdbc:mysql://localhost/testdb?useUnicode=true&characterEncoding=UTF-8", "id", "pw"); stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); sql = new StringBuffer(); sql.append("set @i:=0;select id,@i:=@i+1 as 'num',name,kana from table order by kana"); rs = stmt.executeQuery(sql.toString()); ResultSetMetaData rsmd = null; rsmd = rs.getMetaData(); tbl = new ArrayList<ArrayList>(); //検索結果 取得 if(rs.next()){ ・ ・ ・ ・ といった形でSQL文を実行してるのですが、うまくいきません。 MySQLのバージョンは5.1です。MySQL上でこのSQLを実行するとしっかり結果は取得できたので、Javaプログラムの書き方に問題があると思うのですが、上記のように一度で二つのSQL文を実行することはできないのでしょうか。単一のSQLの実行は正常にできています。ユーザ変数は取得された結果一覧に行番号を付与するために使っています。 2回に分けてこのSQLが実行できるのであれば、その方法でも良いので教えてもらいたいです。 つたない説明で申し訳ないですが、よろしくお願いします。

    • ベストアンサー
    • Java
  • 実行計画(EXPLAIN PLAN、AUTOTRACEの違い)

    こんにちは。 SQLの実行計画を確認するEXPLAIN PLANとAUTOTRACEについて質問です。 先日、仕事でSET AUTOTRACE TRACE EXPで出力された実行計画と EXPLAIN PLANで出力された実行計画が違うということがありました。 なぜこのようなことが起こるのでしょうか? そしてこのようなことがあった場合、どちらの実行計画がSQL走行時に使われるのでしょうか?

  • SQL構文について教えて下さい!

    こんばんわ。 いつもお世話になっております。 ServletでIPアドレスを取得してデータベースに登録してあるデータであって尚且つ、AuthorityというカラムにAかBのどちらかがあるデータを抽出するSQLを作成しているのですが上手くいきません。 教えて下さい!お願いします。 作成中のSQL構文を途中から投稿致します。 String RemoteAdd = request.getRemoteAddr(); try { String sql = "SELECT * FROM Api where (Authority = 'A' OR Authority = 'B') AND IPAddress='"+ RemoteAdd +"'"; PreparedStatement pstmt = conn.prepareStatement(sql); ResultSet rs = pstmt.executeQuery();

  • SQL初心者です。

    SQL初心者です。 SQLPlusをコマンドプロンプトで実行していたのですが、定型のSQL文のためバッチファイルにてスケジュール実行したいと考えています。 コマンドプロンプトを開いて実行していたときはspoolした内容に実行sqlも出力されていたのですが、バッチファイルで同じようにspoolすると実行sqlは出力されず結果のみになってしまいます。 実行したsqlも出力させるには特別にsetするものがあったりするのでしょうか? echoのon、offは試しましたが結果は同じでした。 方法をご教示いただけたら助かります。 よろしくお願いします。

  • SQLが実行されません…

    mysqlDB処理を幾つか行うPHPプログラムを作成しています。 処理内では複数のSQLを実行するのですが、 実行後、毎回1つのSQLが実行されていません… 実行されないSQLはいつも違うSQLです。 実行されなかったSQLのエラー文を出力してみた所 'Transaction already aborted' from NDBCLUSTER と表示されていました。 これはどういった意味を指すのでしょうか? 詳しい方がおられましたらご回答お願いします。

    • ベストアンサー
    • MySQL
  • Oracle9i SQLについて

    Oracle9i SQLについて 環境:WinXP(SP3),Oracle9i,VB2005 受注のテーブルから未出荷で品番毎に一番早い納期の 受注数を取得したいのですが上手くいきません ご教授願います。 SQL出力結果イメージ 品番  納期   受注数 A 2010/06/01 6 B 2010/05/26 10 C 2010/05/24 1

  • SQL*Plus:SPOOLコマンドでのSQL出力

    Oracle SQL*Plusで、SPOOLコマンドを使用すると、SQL実行の結果はファイルに出力されますが、実行したSQL自身が出力されません。 SETコマンドで制御できるのではないかと思いましたが、ちょっと見当たりませんでした。 何か方法はないでしょうか? よろしくお願いします。

  • SQLローダーをコマンドプロンプトから実行

    SQLローダーをコマンドプロンプトから実行した場合にロードは実行されログも出力されているのに終了しない。コマンドプロンプトのまま。タスクマネージャーを見るとSQLLDRのタスクが残っている。別端末で実行すると正常に返る。 環境:サーバーWindowsNT4.0 DB oracle8.0.5 クライアントWin2000サーバー oracle8.0.5

  • SQL*Plusの実行結果にSQL文も残したいです

    SQL*Plusをスクリプトファイルを使って実行した際、実行SQLの出力はできないものでしょうか? 以下のようにスクリプトファイルを使ってSQL*Plusを実行し、その結果をログファイルへ 残しています。この時ログファイルには、実行結果は出力されるのですが、実行SQLは 出力されないようです。なんとかして実行SQLと、実行結果を作業ログとして残したいと 考えているのですが、何かよい方法はないものでしょうか? [ama@rh01 test]$ sqlplus scott/tiger@orcl @test01.sql > test01.log ■環境 Red Hat Linux 4 Oracle10g ■以下test01.sqlの中身です。 ---ここから-------------- create table ex01 ( c1 number, c2 varchar2(10), c3 varchar2(40) ); insert into ex01(c1,c2,c3) values(1,'AA1','BBB1'); select * from ex01; update ex01 set c2='aa1' where c1 =1; select * from ex01; exit; ---ここまで-------------- ■以下ログファイルの中身です。 ---ここから------------------ [ama@rh01 test]$ cat test01.log 省略 With the Partitioning, OLAP and Data Mining options に接続されました。                       ←ここにcreate文を出力したいです。 表が作成されました。                       ←ここにinsert文を出力したいです。 1行が作成されました。                       ←ここにselect文を出力したいです。 C1       C2   C3 ---------- ---------- ---------------------------------------- 1        AA1   BBB1                       ←ここにupdate文を出力したいです。 1行が更新されました。                       ←ここにselect文を出力したいです。 C1      C2 C3 ---------- ---------- ---------------------------------------- 1 aa1 BBB1 Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production With the Partitioning, OLAP and Data Mining optionsとの接続が切断されました。 [ama@rh01 test]$ -------------------ここまで--------------- どなたか良いアドバイスいただけたらと思います。 どうぞよろしくお願いします。

  • SQLをバッチで実行

    掲題の件で少し教えていただきたいことがあります。 バッチファイルでSQLPLUSを起動し、 @XXXXXXXXX.SQL >> XXX.log(バッチのログ)と 実行するのですが、このSQL文がインサート文や アップデート文など通常のSQL文だと バッチでのリダイレクションの結果に XX行作成されました。とかXX行更新されましたとか 出力されると思うのですが、 実行するSQL文の中でさらに、 @XXXXXXXXX.SQL と記述していると どのようにログファイルに出力されますか? XX行作成されました。とかXX行更新されましたとか が出るとうれしいのですが… わかりにくい質問かもしれませんがお願いいたします。