0

私は以下を持っていますnative sql query。データベースを使用してOracleいます。

select
         * 
     from
         (select
             row_.*,
             rownum rownumber 
         from
             (select
                 colmn1,
                 colmn2,
                 colmn3,
                 colmn4,
                 colmn5,
                 colmn6,
                 from
                 Table5
             where
                 colmn5 In (
                    '19901','10001'
                 ) 
             order by
                colmn1 ) row_ ) 
         Where
             Rownumber <= 50000
             and rownumber > 0

上記のクエリは50000レコードを返します。で上記のクエリを実行するとsqldeveloper、それだけで済みます30 secondsが、Spring と Hibernate の統合アプリケーションでは15 minutes. どうすればパフォーマンスを向上させることができますか?

ありがとう!

4

1 に答える 1

0

2 つの内部選択があります。内部選択は、データベースが最適な検索戦略を見つけるのを妨げる可能性があるため、常にパフォーマンス低下の原因となる可能性があります。

私が見る限り、行番号を処理するためだけに内部選択を使用しています。最も内側の選択のみを使用し、Java/hibernate レベルで行番号を処理すると、パフォーマンスが大幅に向上します。

この選択のみを使用します

select colmn1, colmn2, colmn3, colmn4, colmn5, colmn6,
   from Table5
   where colmn5 In ('19901','10001') 
   order by colmn1

これにはデータベースの特殊性がないため、HQL ステートメントで簡単に置き換えることができ、使用するデータベースからプログラムを独立させることができます (Java クラスとプロパティ名は実際のものに置き換える必要があります)。

from Table5_Class
   where colmn5_Prop in ('19901','10001') 
   order by colmn1_prop

Where Rownumber <= 50000 and rownumber > 0次に、where 条件を hibernate メソッドにQuery.setMaxResults(50000)置き換えますQuery.setFirstResult(0)(注: setFirstResult(0) は行 0 が常に最初の行であるため余分ですが、次の 50000 行も取得したいので、setFirstResult(n を使用できます) )))。

パラメータとして行番号が必要な場合は、結果のリストのインデックスを使用できます。

P. S: SQL 開発者の方が Hibernate よりもはるかに高速である理由はわかりません。

于 2012-10-18T06:29:58.300 に答える