programing

Hibernate Criteria vs HQL : 어느 것이 더 빠릅니까?

nasanasas 2020. 11. 13. 08:21
반응형

Hibernate Criteria vs HQL : 어느 것이 더 빠릅니까?


몇 가지 답변을 읽었지만 여전히 혼란 스럽습니다. 왜? 당신이 언급 한 차이점은 성능과 관련이 없기 때문입니다. 쉬운 사용과 관련이 있습니다 (Objetc (criteria) 및 SQL (hql)). 그러나 어떤 이유로 "기준"이 hql보다 느린 지 알고 싶습니다.

나는 이것을 다른 답변에서 읽었습니다.

"HQL과 criteriaQuery 간에는 성능면에서 차이가 있습니다. criteriaQuery를 사용하여 쿼리를 실행할 때마다 DB에 대해 마지막으로 쿼리 한 캐시에 반영되지 않는 테이블 이름에 대한 새 별칭이 생성됩니다. 이로 인해 오버 헤드가 발생합니다. 생성 된 SQL을 컴파일하는 데 더 많은 시간이 걸립니다. " 작성자 : Varun Mehta.

이것은 매우 가깝지만! 나는 다른 웹 사이트에서 읽었다 (http://gary-rowe.com/agilestack/tag/hibernate/) 이것은 더 이상 Hibernate 3.3 이상에서는 그렇지 않다 (읽어주세요 : 9) Hibernate는 SQL에 의해 생성 된 SQL이기 때문에 느립니다. 기준 인터페이스가 일치하지 않음)

차이점을 찾으려고 몇 가지 테스트를 수행했지만 둘 다 qry를 생성하고 테이블에 대한 별칭을 변경하지 않습니다.

나는 매우 혼란 스럽습니다. 누군가가 주된 이유를 안다면 우리를 도울 수 있습니까? 감사


저는 2004 년에 Hibernate 3 쿼리 번역기를 작성한 사람이므로 작동 방식에 대해 알고 있습니다.

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

따라서 SQL 생성 오버 헤드 측면에서 다음과 같은 이점이 있습니다.

  1. 명명 된 HQL / JPAQL 쿼리-SQL 생성은 한 번만 발생합니다.
  2. 기준-생성하기 전에 구문 분석 할 필요가 없습니다.
  3. (이름 없음) HQL / JPAQL 쿼리-구문 분석 한 다음 생성합니다.

즉, 구문 분석 및 SQL 생성의 오버 헤드를 기반으로 쿼리 기술을 선택하는 것은 아마도 제 생각 에는 실수 일 것입니다 . 이 오버 헤드는 실제 데이터가있는 실제 데이터베이스 서버에서 실제 쿼리를 수행하는 것과 비교할 때 일반적으로 매우 적습니다. 응용 프로그램을 프로파일 링 할 때이 오버 헤드가 실제로 표시 않는 경우 어쩌면 당신은 명명 된 쿼리로 전환해야한다.

Criteria와 HQL / JPAQL 중에서 결정할 때 고려하는 사항은 다음과 같습니다.

  • 첫째, 당신은 당신이 경우에있는 거 결정해야 확인을 갖는 최대 절전 모드 독점 API에 대한 의존성을 코드에서. JPA에는 기준이 없습니다.
  • 기준은 다중 매개 변수 '검색 양식'이있는 일반적인 웹 페이지에서 찾을 수있는 것과 같이 많은 선택적 검색 매개 변수를 처리하는 데 정말 좋습니다 . HQL을 사용하면 개발자는 StringBuilder를 사용하여 where 절 식을 사용하는 경향 이 있습니다 ( 피하십시오! ). Criteria를 사용하면 그렇게 할 필요가 없습니다. Hardik은 비슷한 의견을 올렸습니다.
  • HQL / JPAQL은 대부분의 다른 작업에 사용할 수 있습니다. 왜냐하면 코드가 작고 개발자가 이해하기 쉽기 때문입니다.
  • HQL을 사용하면 매우 빈번한 쿼리를 명명 된 쿼리로 바꿀 수 있습니다. 프로파일 링 후 나중에이 작업을 수행하는 것을 선호합니다.

나는 수백만 개의 레코드를 작업하고 있습니다. HQL이 Criteria보다 훨씬 빠르다는 것을 알았습니다. 기준은 성능면에서 많이 뒤쳐집니다.

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


HQL보다 기준에 대해 생각하는 다른 이점 :

HQL을 작성하면 코드가 복잡해집니다. 더 이상 깨끗한 객체 지향 코드를 작성하는 것처럼 보이지 않습니다.

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


나는 주로 동적 쿼리에 Criteria Queries를 선호합니다. 예를 들어 일부 매개 변수에 따라 일부 순서를 동적으로 추가하거나 일부 부품 (예 : 제한)을 제외하는 것이 훨씬 쉽습니다.

반면에 HQL을 이해하고 읽기가 훨씬 쉽기 때문에 정적 및 복잡한 쿼리에 HQL을 사용하고 있습니다. 또한 HQL은 예를 들어 다른 조인 유형에 대해 좀 더 강력하다고 생각합니다.

JPA 및 최대 절전 모드-기준 대 JPQL 또는 HQL


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

참고 URL : https://stackoverflow.com/questions/4401240/hibernate-criteria-vs-hql-which-is-faster

반응형