2010-12-09 4 views
57

나는 약간의 anwers를 읽고있다. 그러나 나는 아직도 혼란 스럽다. 왜? 언급 한 차이점은 실적과 관련이 없기 때문입니다. 그들은 쉬운 사용과 관련이 있습니다 (Objetc (기준) 및 SQL (hql)). 하지만 "기준"이 어떤 이유로 hql보다 느린 지 알고 싶습니다.Hibernate Criteria 대 HQL : 더 빠름?

내가 다른 anwers

이 읽기 ​​"HQL과 criteriaQuery, 당신이 criteriaQuery를 사용하여 쿼리를 발생 매번 사이의 성능면에서 차이가 있습니다, 그것은에 반영되지 않습니다 테이블 이름에 대한 새 별명을 만듭니다 모든 DB에 대해 마지막으로 쿼리 된 캐시가 생성되므로 생성 된 SQL을 컴파일하는 데 오버 헤드가 발생하여 실행 시간이 오래 걸립니다. " Varun Mehta.

이것은 매우 가까이 있지만! 다른 웹 사이트 (http://gary-rowe.com/agilestack/tag/hibernate/)에서 읽었을 때 이것은 Hibernate 3.3 이상에서는 더 이상 발생하지 않는다. (읽기 : 9) Hibernate는 느리다. 조건 인터페이스가 일관성이 없음)

차이점을 알아 내려고 일부 테스트를 수행했지만 qry를 생성하고 테이블의 별칭을 변경하지 않았습니다.

나는 매우 혼란 스럽다. 주된 이유를 아는 사람이 있으면 도와 주시겠습니까? 감사합니다.

답변

2

저는 주로 동적 쿼리에 대한 기준 쿼리를 선호합니다. 예를 들어 일부 매개 변수에 따라 일부 주문 (예 : 제한)을 동적으로 추가하거나 남겨 두는 것이 훨씬 쉽습니다.

반면 정적/복잡한 쿼리에 HQL을 사용하고 있습니다. HQL을 이해하고 읽기가 훨씬 쉬워 졌기 때문입니다. 또한 HQL은 좀 더 강력합니다. 다른 조인 유형의 경우.

JPA and Hibernate - Criteria vs. JPQL or HQL

+2

Criteria는 HQL이 수행 할 수있는 조인 유형의 대부분을 수행 할 수 있지만, 때로는 약간의 어색하거나 이해하기 힘들다 (필자 의견으로는). HQL에 대해 읽기가 쉽다는 것이 맞습니다! –

+1

BTW, 나는 당신의 대답에 투표 할 것입니다 ...하지만 당신은 정말로 kcobuntu의 질문에 대답하지 않았습니다. –

+23

다른 사람의 대답을 복사하려면 최소한 언급해야합니다. 원래 응답에 연결하십시오 : http://stackoverflow.com/a/197496/980103 –

124

나는 2004 년에 다시 최대 절전 모드 3 질의 번역기를 쓴 사람, 그래서 나는 그것이 어떻게 작동하는지에 대해 뭔가를 알고있다.

이론적으로 이론적으로 HQL 쿼리보다 오버 헤드가 적어야합니다 (명명 된 쿼리 제외). 이것은 Criteria가 아무 것도 해석 할 필요가 없기 때문입니다. HQL 쿼리는 ANTLR 기반 파서로 구문 분석 된 다음 결과 AST가 SQL로 변환됩니다. 그러나 HQL/JPAQL을 사용하면 명명 된 쿼리를 정의 할 수 있으며 여기서 SessionFactory가 시작될 때 SQL이 생성됩니다. 이론적으로 명명 된 쿼리는 Criteria보다 오버 헤드가 적습니다.

그래서, SQL 세대 오버 헤드 측면에서 우리는이 :

HQL/JPAQL 쿼리 명명 된
  1. 이 - SQL 생성 한 번만 발생합니다.
  2. 기준 - 생성하기 전에 구문 분석 할 필요가 없습니다.
  3. (이름이 지정되지 않음) HQL/JPAQL 쿼리 - 구문 분석 후 생성하십시오. 구문 분석 및 SQL 생성의 오버 헤드를 기반으로 쿼리 기술을 선택
  4. 는 말했다

, 아마 제 생각에 실수입니다. 이 오버 헤드는 실제 데이터가있는 실제 데이터베이스 서버에서 실제 쿼리를 수행하는 것과 비교할 때 일반적으로 매우 작습니다. 이 오버 헤드가 실제로 응용 프로그램을 프로파일 링 할 때 나타나면 일 수도 있고 일 수도 있습니다. 이름이 지정된 쿼리로 전환해야합니다.여기

이 기준 및 HQL/JPAQL 사이에 결정할 때 고려해야 것들이다 :

  • 첫째, 당신은 당신이 최대 절전 모드 독점 API에 의존성을 갖는 OK이라면 결정해야 당신의 코드. JPA에는 기준이 없습니다.
  • 기준은 여러 매개 변수 '검색 양식'이있는 일반적인 웹 페이지에서 찾을 수있는 많은 선택 검색 매개 변수을 처리하는 데 정말 좋습니다. 개발자는 HQL을 사용하여 StringBuilder (이 발생하지 않도록하십시오!)를 사용하여 where 절 표현식을 처리하는 경향이 있습니다. 기준으로, 당신은 그것을 할 필요가 없습니다. Hardik도 비슷한 견해를 밝혔습니다.
  • HQL/JPAQL은 개발자가 이해하기 쉽고 코드가 작아지는 경향이 있기 때문에 대부분의 다른 용도로 사용할 수 있습니다.
  • HQL을 사용하면 자주 쿼리를 명명 된 쿼리로 변환 할 수 있습니다. 필자는 나중에 프로파일 링을 한 후에이 작업을 선호합니다.
+0

'JPA에는 기준이 없습니까? ' – destan

+3

@destan JPA 2.x부터 적용됩니다. IIRC, JPA 1.x는 그렇지 않습니다. –

+0

@ JoshuaDavis 우수 설명. StringBuilder를 사용하여 HQL을 작성하지 않아야하는 이유를 알고 싶습니다. 선택적 매개 변수로 수행 할 작업 (예 :?) –

6

나는 수백만 건의 레코드 작업 중입니다. HQL이 Criteria보다 훨씬 빠르다는 것을 알게되었습니다. 기준은 성능면에서 많이 뒤떨어져 있습니다.

많은 양의 데이터를 다루는 경우 HQL로 이동하십시오.

+2

이것은 나에게별로 의미가 없습니다.매우 큰 데이터 세트가있는 경우 데이터베이스가 쿼리를 처리하기를 기다리는 데 대부분의 시간이 소요됩니다. 이 경우 HQL이나 Criteria로부터 SQL을 생성하는 데 걸리는 시간은 중요하지 않습니다. JPAQL 명명 된 쿼리 대 '똑 바른'JPAQL 대 조건은 동일한 쿼리를 여러 번 수행 할 때만 가능합니다. 데이터 세트의 크기는 전혀 중요하지 않습니다. –

+1

올바른 방법으로 기준을 사용하지 않았습니까. 또는 수백만 개의 레코드 각각에 대해 새로운 Criteria Query 개체를 만들었습니까? – vinodn

3

다른 장점은 내가 HQL 이상의 기준에 대한 생각 :

쓰기 HQL 코드가 지저분합니다. 깨끗한 객체 지향 코드를 작성하는 것처럼 보이지 않습니다.

IDE는 Criteria Queries를 작성하는 동안 Intellisense를 사용하여 제안하지만, 변수 이름과 같은 것을 큰 따옴표로 쓸 때를 제외하고는 실수를 범할 가능성이 적습니다.

1

당신이 옳다. 결과 목록은 데이터베이스 또는 캐시에서 org.hibernate.loader.Loader 클래스로 검색됩니다. 캐시가 활성화되어 있지 않으면 Prepared 문은 SessionFactoryImp에서 생성 된 Dialect 객체를 사용하여 빌드됩니다. 따라서 명령문은 목록 호출 당 초기화됩니다. 또한 저급 쿼리가 자동으로 생성됩니다. 기본적으로 원조이지만 수동으로 작성하면 특정 쿼리가 더 효과적 일 수 있습니다.

관련 문제