문제

무엇입니까? 성능 hql과 기준Api 및 QueryOver의 차이점은 무엇입니까?하나가 다른 것보다 빠르거나 느린 상황이 있습니까?

편집하다:QueryOver와 Linq를 사용하여 질문을 확장했습니다.

=============================================

글쎄요, 어떤 응답을 답변으로 표시해야 할지 잘 모르겠으므로 게시물에 VoteUp이 가장 많이 포함된 것으로 표시하겠습니다.모르겠습니다.이것은 실제로 질문보다 더 많은 토론입니다.

도움이 되었습니까?

해결책

ICriteria와 HQL의 성능 특성은 한 가지 간단한 이유 때문에 조금씩 다릅니다(QueryOver에 대해 잘 모르겠습니다).

ICriteria 쿼리는 기본적으로 매핑에 정의된 대로 가져오기 전략을 구현하려고 시도하는 반면, HQL은 기본적으로 모든 것을 Lazy로 간주하고 쿼리 내부의 조인 선언에 따라 무엇을 열심히 가져오는지 여부를 정의합니다.

또한 ICriteria는 매개변수 전달을 위한 매핑에 의존하는 반면 HQL은 명시적인 매개변수 유형을 허용합니다.IQuery.SetInt32("fooParam", 5);

실제로 중요한 것은 NH 엔진이 ICriteria를 해결하고 가장 유효한 SQL을 생성해야 하는 ICriteria 쿼리(ICriteria.CreateCriteria().CreateCriteria() 등 참조)의 연결 가능성입니다.

반면에 HQL 쿼리가 일관된 결과를 생성하는지 예측하기가 더 쉬우므로 QueryCache 사용이 더 쉬워집니다.

어느 쪽이든 ISessionFactory 생성 및 매핑 정의와 메모리 내에 없는 구성을 사용하여 구성이 한 번 생성되므로 성능이 좋습니다.

실제 SQL 생성은 둘 사이에서 다르게 이루어지므로 ICriteria -> HQL용 유틸리티가 존재하지 않습니다.

결국 내 경험에 따르면 두 제품 사이의 성능은 아마도 몇 밀리초 정도 주고받거나 걸릴 수도 있습니다.

참고로, 매핑에서 가능한 한 많이 선언하면 NHibernate 작업뿐만 아니라 더 간결한 SQL 생성이 발생합니다. 예를 들어 문자열 속성 매핑 Length .hbm.xml에서 NHibernate는 데이터베이스로 이동하기 전에 문자열 길이를 확인하게 됩니다.

다른 팁

쿼리 오버가 관련된 한, API의 확장으로 내장되어 있기 때문에 성능이 기준 API와 동일 할 것으로 예상됩니다.따라서 두 API의 동등한 쿼리에 대해서는 동일한 데이터베이스 쿼리를 생성 할 것으로 기대합니다.쿼리 및 기준 인터페이스 사이에 설명한 유일한 차이점은 쿼리 인터페이스가 "클리너"와 더 즐거운 시간이 될 수 있습니다.

내 경험에서 Criteria API는 HQL 인터페이스보다 "사랑"을 더 많이 받았습니다.HQL 인터페이스에서 Express 할 수있는 동등한 방법을 찾을 수없는 기준 인터페이스로 특정 쿼리를 표현할 수있는 경우를 실행했습니다.

성능에 관한 쿼리가 "묻는 메시지"가 Criteria API 대 쿼리를 선택하는 것보다 성능이 더 많은 기능을 갖추고 있습니다.나는 당신의 생각에 가장 자연스러운 적합성을 제공하는 인터페이스를 사용합니다.

쿼리 오버는 개선 된 구문과 유형 안전으로 인해 대부분의면에서 기준을 대체 할 수 있습니다. 그러나 쿼리 에서 람다 표현식을 비싸게 처리하는 것이 주목해야합니다 (그리고 LINQ 쿼리에도 동일한 적용이 적용됩니다). 따라서 End SQL 쿼리를 실행하는 동안 쿼리 개체를 적절한 SQL 쿼리로 변환하는 다른 메소드 (ICRITERIA, HQL)보다 오래 걸리지 않습니다.

예를 들어, 우리는 수백 개의 쿼리 오버 쿼리를 실행하는 응용 프로그램을 개발하고 있습니다 (ADO.NET 일괄 처리 지원 사용). 쿼리를 ICRITERIA로 변환하는 것이 쿼리를 실행하고 CPU 사용을 줄이는 능력이 거의 두 배가되었습니다. ...에 두 번째 수준의 캐시 및 쿼리 캐싱을 사용하면 람다 표현식 처리와 관련된 오버 헤드가 많이 줄어들 수 있습니다. 그러나 이것이 우리의 응용 프로그램에 적합하지 않으므로, 나는 이것을 나 자신에게하지 않았습니다.

더 빨리 당신의 일반적인 질문에 관해서는 더 빨리 : 정말로 의존합니다. 전용 확실한 방향은 프로파일 링 도구를 실행하는 것입니다 (NHPROF는 이와 같은 시나리오에 대한 불가사의가 불가사의)입니다. 그러나 일반적으로 HQL은 SQL에 가장 가까운 것이므로 가장 유연하게 쿼리를 최적화하기 위해 조금 더 많은 범위를 허용합니다. 그러나 대부분의 대다수의 중간 복잡성 쿼리에 대한 대다수의 경우 ICRITERIA와 HQL 사이에는 차이가 거의 없습니다. 쿼리가 동적으로 내장 된 경우 ICRiteria 쿼리는 훨씬 쉽습니다.

나는 아직 둘 사이의 차이를 발견하지 못했습니다.그렇게 할 때 - HQL은 Criteria-API에서 사용할 수없는 기능이 있습니다.

전자 또는 후자를 사용하는 경우 주로 스타일과 개인적 취향의 문제입니다.쿼리에서 SQL 로의 번역은 쿼리와 관련하여 많은 것을 설명하지 않습니다.

i : http://ayende.com/blog/archive/2009/06/01/nhibernate-queries-ndash-should-i-use-hql-or-criteria.aspx

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top