2012-04-26 2 views
2

내 클래스 CustomerMarket 정의에 @NamedQuery(name="CustomerMarket.findByMarketId", query="SELECT DISTINCT c.marketid FROM CustomerMarket c WHERE c.marketid LIKE :mask") 이라는 쿼리가 있습니다.@NamedQuery에 적용된 TOP 절

내가 350_000의 첫번째 1_000 그래서 난이 적용 setMaxResult 결과를 먹고 싶어 : 나는 server.log에 확인이 쿼리를 수행 한 후

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

을 발견 나는 정확한 데이터를 가지고

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

이, 첫 번째 1, 000 개의 레코드가 있지만 TOP 제한이 적용되는지 그리고 어디에 있는지 알고 싶습니다.

이 TOP 절은 어떻게 처리됩니까?

  1. TOP는 Hibernate에 의해 사용되며,이
  2. TOP 자바 측에서 DB 및 필터 데이터에서 결과를받은 후 적용 로그에 표시되지 않습니다 호출 문에 적용되는
  3. 또는 다른 어떤

거의 모든 것을 표시하기 위해 persistance.xml 및 log4j.properties를 설정했지만 SQL 스크립트가 있으므로 아무 문제가 없다고 생각합니다.

편집 : 나는 (와는 setMaxResults없이) 두 경우 모두에서 일부 성능 측정을 다음있어 않았다 시간 : TOP 나는 한 평균 시간 소비 1400ms 당없이 첫 번째 경우에

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

고르다. TOP 구현의 두 번째 경우에는 평균 소비 시간이 약 150ms였습니다.

이 TOP 구현은 사용 된 최대 절전 모드 (우리는 Sybase를 사용하고 있습니다)에 의존 할 수 있다고합니다. 그리고 로그에 나타나는 select는 정확히 DB로 보내는 select와 같습니다. 그러나이 경우 메타 데이터없이 구조 목록에 resultset (또는 Hibernate 세션에 저장된 결과가 어떻게 저장 되는가)에서 350k 결과를 변환하는 것이 오랜 시간이 걸리는 것은 정상입니까? 내가 내부적으로 그런 일을 변환되는 것을 상상할 수 는 :

**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 링크에는 사용자가 결과 수를 제한 할 수있는 방법이 설명되어 있습니다. 보시다시피, 오직 하나의 Sybase가 이러한 종류의 선택을 두 개의 개별 작업 (SET + SELECT)으로 나눕니다. 따라서 모든 문제는 첫 번째 작업이 기록되지 않고 두 번째 작업이 기록된다는 것입니다.