> 데이터 베이스 > MySQL 튜토리얼 > Eager Fetching을 사용하는 NHibernate QueryOver가 왜 여러 SQL 쿼리를 생성합니까?

Eager Fetching을 사용하는 NHibernate QueryOver가 왜 여러 SQL 쿼리를 생성합니까?

Susan Sarandon
풀어 주다: 2025-01-05 16:13:45
원래의
502명이 탐색했습니다.

Why Does NHibernate QueryOver with Eager Fetching Generate Multiple SQL Queries?

Fetch를 사용하는 NHibernate QueryOver로 인해 여러 SQL 쿼리가 발생함

쿼리 문제:

사용 시 즉시 로드를 사용하여 관련 목록을 가져오는 QueryOver에서 여러 데이터베이스 적중이 발생하여 수많은 오류가 발생합니다. 별도의 SQL 쿼리.

예:

Session.QueryOver<UserRole>()
       .Fetch(x => x.UsersInRole).Eager
       .List();
로그인 후 복사

설명:

이 동작은 많은 쿼리의 특성으로 인해 발생합니다. - 대 다 관계. 예제 매핑에서 UserRole 엔터티는 UsersInRole 엔터티와 다대다 관계를 갖습니다. Eager 로딩이 사용되면 NHibernate는 검색된 각 UserRole 엔터티에 대해 모든 관련 UsersInRole 엔터티를 로드하려고 시도합니다.

그러나 세션에 아직 모든 관련 엔터티가 포함되어 있지 않을 수 있으므로 이러한 관계를 검색하기 위해 여러 SQL 쿼리가 실행됩니다. 초기 쿼리는 UserRole 엔터티를 검색하고 후속 쿼리는 각 UserRole에 대해 실행되어 관련 UsersInRole 엔터티를 검색합니다.

해결책:

SQL 쿼리를 최소화하는 효과적인 솔루션 일괄 가져오기를 사용하는 것입니다. HasManyToMany 매핑에 BatchSize 속성을 설정함으로써 NHibernate는 단일 SQL 쿼리에서 여러 관련 엔터티를 가져올 수 있습니다.

HasManyToMany(x => x.UsersInRole)
...
.BatchSize(25)  
로그인 후 복사

배치 크기를 적절한 값(예: 25)으로 설정하면 NHibernate는 SQL 쿼리 수를 제한하여 총 데이터베이스 적중 횟수를 줄이고 성능을 향상시킵니다.

또한 클래스 맵에서 배치 크기를 설정합니다. 전체 가져오기 전략을 최적화하는 데도 도움이 될 수 있습니다.

위 내용은 Eager Fetching을 사용하는 NHibernate QueryOver가 왜 여러 SQL 쿼리를 생성합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿