2014-04-12 4 views
1

성능을 위해 명명 된 쿼리와 Hibernate Criteria을 비교하려고합니다. 나는 그것이 모두 실제 쿼리 자체에 달려 있다는 것을 알고 있으며 마지막 단어는 런타임에 프로파일이 어떻게되는지에 관한 것입니다. 여전히, 각각에 들어가는 것을 정리하려고합니다.Hibernate - 명명 된 쿼리와 명명 된 쿼리

기준 매개 변수에서 작동 : - 최대 절전 모드 기준 및 명명 된 쿼리는 기본적으로 어떻게 작동하는지

PART-1가 :

은 내가 모두에서 확인/수정을 찾고 두 부분 &의 Q를 구성하려 . 런타임시 쿼리에서 구문 분석이 필요하지 않습니다. 과 같은 여러 가지 검색 및 "현재 제공되는"매개 변수가 있으며 결과를 정렬하고 스크롤 가능한 것으로 반환하십시오. 기준을 읽지는 않았지만 확인 기준은 (필드에 설정된 매개 변수를 기반으로) 필드에 대한 인덱스가 모두 더 빠르게 만들려면 입니다.

따라서 Criteria의 이점은 평범한 HQL 과 비교할 때 실행 중 속도입니다.

명명 된 쿼리는 HQL-- 과 동일한 장점이 있습니다. 쿼리는 시작시 한 번 구문 분석됩니다. 그런 다음 응용 프로그램에서 필요에 따라 을 실행합니다.

PART-2 - 비교하는 두 :

이 그림에서

그래서,

기준 및 명명 된 쿼리가 서로 어떻게 비교합니까?

기준 수단 최적화하고, 따라서 쿼리를 빠르게하기 위해 한 (?)

명명 된 쿼리는 "정의 - 한 번 사용의 이점을 가지고 여러 테이블 여러 params--에서 복잡한 쿼리에 대해 잘 작동 -everywhere "및 은"light "쿼리에 대해 꽤 괜찮습니다. 일반적으로 단일 테이블에 소량의 매개 변수가있는 복잡한 검색은 덜 복잡합니다. 빈번한 질의에 대해서조차 더 낫다.

참고 : 다른 유용한 토론에서는 매우 유용합니다. Hibernate Criteria vs HQL: which is faster?.

TIA.

답변

9

성능에 따라 다른 하나를 선택하지 마십시오. 결국, 그것은 어쨌든 SQL 쿼리가되며 중요한 것은 SQL 쿼리의 성능입니다.

SQL 쿼리를 실행하는 것은 HQL 쿼리를 구문 분석하고이를 SQL로 변환하는 것보다 훨씬 느립니다. 따라서 명명 된 쿼리를 사용하지 않아도 성능이 크게 저하되지는 않습니다.

기능 및 가독성을 기준으로 HQL 기준을 선택합니다.

읽을 수있는 것이 있으면 HQL 쿼리를 사용하십시오.

다양한 선택적, 검색 기준을 기반으로 동적으로 쿼리를 작성하려면 Criteria API가이를 허용하며 동적으로 HQL 쿼리를 작성하는 것보다 편리합니다.이론

4

기준, (I가 얻을 것이다 명명 된 쿼리를 제외하고)는 HQL 질의보다 적은 오버 헤드를해야한다. 이것은 Criteria가 아무 것도 해석 할 필요가 없기 때문입니다. HQL 쿼리는 ANTLR 기반 파서로 구문 분석 된 후 결과 AST가 SQL로 변환됩니다. 그러나 HQL/JPAQL을 사용하면 SessionFactory가 시작될 때 SQL이 생성되는 명명 된 쿼리를 정의 할 수 있습니다. 이론적으로 명명 된 쿼리는 Criteria보다 오버 헤드가 적습니다. 그래서, SQL 세대 오버 헤드 측면에서 우리는이 :/JPAQL 쿼리 HQL 명명 된

  1. - SQL 생성 한 번만 발생합니다.
  2. 기준 - 생성하기 전에 구문 분석 할 필요가 없습니다.
  3. (이름이 지정되지 않음) HQL/JPAQL 쿼리 - 구문 분석 후 생성하십시오. 즉, 구문 분석 및 SQL 생성의 오버 헤드를 기반으로 쿼리 기술을 선택하는 것은 실수로 생각할 수 있습니다. 실제 데이터가있는 실제 데이터베이스 서버에서 실제 쿼리를 수행하는 것과 비교할 때이 오버 헤드는 일반적으로 매우 작습니다. 이 오버 헤드가 실제로 응용 프로그램을 프로파일 링 할 때 나타나면 어쩌면 명명 된 쿼리로 전환해야합니다. 여기

은 기준 및 HQL/JPAQL 사이에 결정할 때 고려해야하는 일입니다, 당신이 최대 절전 모드 독점 API에 대한 종속성을 갖는 당신이 OK 인 경우 결정해야

  • 먼저 당신의 암호. JPA에는 기준이 없습니다.
  • 기준은 여러 매개 변수 '검색 양식'이있는 일반적인 웹 페이지에서 찾을 수있는 것과 같이 많은 선택적 검색 매개 변수 을 처리하는 데 정말 좋습니다. HQL을 사용하면 개발자는 WhereBuilder를 사용하여 where 문을 표현식에 두는 경향이 있습니다 (이것을 피하십시오!). 기준을 사용하면 을 수행 할 필요가 없습니다.
  • 코드는 이 개발자가 이해하기 쉽고 작기 때문에 HQL/JPAQL을 대부분의 다른 용도로 사용할 수 있습니다.
  • HQL을 사용하면 자주 쿼리를 명명 된 쿼리로 변환 할 수 있습니다. 필자는 나중에 프로파일 링을 한 후에이 작업을 선호합니다.