2012-04-26 11 views
2

私のクラスCustomerMarketの定義には、 @NamedQuery(name="CustomerMarket.findByMarketId", query="SELECT DISTINCT c.marketid FROM CustomerMarket c WHERE c.marketid LIKE :mask") という名前のクエリがあります。私は、のserver.logをチェックし、私は正しいデータを持っているこの@NamedQueryにTOP節が適用されました

select distinct customerma0_.marketid as col_0_0_ 
from CUSTOMER_MARKET_S customerma0_ 
where customerma0_.marketid like ? 

を発見し、このクエリを実行した後

Query market = session.getNamedQuery("CustomerMarket.findByMarketId"); 
market.setString("mask", getMask() + "%"); 
market.setMaxResults(1000); 
List<Object> result = market.list() 

:私は350_000の最初1_000を取りたい

ので、私はsetMaxResultを適用結果最初の1_000レコードですが、TOP制約が適用されているかどうか、どこで知りたいのですか。

このTOP句はどのように処理されますか?

  1. TOPは、Hibernateが使用され、これが
  2. TOPは、Java側でDBとフィルタデータから結果を受け取った後に適用されるログに表示されていないコール可能文に適用される
  3. または何か他

私はほとんどすべてを表示するためにpersistance.xmlとlog4j.propertiesを設定しましたが、SQLスクリプトがあるので問題はないと思います。

EDIT: 私は(ととはsetMaxResultsなし)との両方のケースでパフォーマンスのいくつかの測定を以下しまった回:TOP I持っていた平均時間消費1400ms当りのない最初のケースで

long time = System.currentTimeMillis(); 
market.list(); 
LOGGER.info("time: " + (System.currentTimeMillis() - time) + "ms"); 

選択します。 TOPを実装した2番目のケースでは、平均消費時間は約150msでした。

このTOPの実装は、使用されているHibernateの方言(Sybaseを使用しています)に依存している可能性があります。そして、ログに表示される選択は、DBに送信されるものとまったく同じです。 しかしこの場合、350kの結果をresultet(またはHibernateセッションに格納された結果はどのようにして)からメタデータのない構造体リストに変換するのは長い時間がかかりますか?私は内部的にはそのような何かに変換されていることを想像することができ は:

**SQL generating process** 
**SQL setting parameters** 
ResultSet rs = executeQuery(); 
List<Object[]> result = new ArrayList<Object[]>(rs.getFetchSize()); 
int rowSize = rs.getMetaData().getColumnCount() 
while (rs.next) { 
    Object[] row = new Object[rowSize]; 
    for (int i = 0; i < rowSize; i++) { 
    row[i] = rs.getObject(i); 
    } 
} 

これは非常に複雑であるように思われませんので、なぜこの時間差があります。おそらく、私はHibernateが多くの機能を備えた複雑なフレームワークなので、素朴です。 :-D

答えて

0

私の問題は私のアプリケーションに使用するDBにあるようです。リンクwww.petefreitag.com/item/59.cfmには、ユーザーがその結果の数をどのように制限できるかが記載されています。お分かりのように、この種の選択は2つの別々のアクション(SET + SELECT)に分かれています。したがって、最初のアクションはログに記録されず、2番目のアクションは記録されません。

関連する問題