Ayende은 그의 게시물에 NHibernate Mapping – Inheritance에 어떻게 다양한 NHibernate 상속 전략이 작동 하는지를 개략적으로 설명합니다. 그의 유니온 서브 클래스에 대한 설명은 여러 테이블을 결합하는 하위 쿼리를 사용하여 생성 된 SQL을 보여줍니다. 이 하위 쿼리는에서 선택됩니다.왜 NHibernate는 유니온 서브 클래스의 서브 쿼리를 특정 ID로 제한하지 않습니까?
내가 이해하지 못하는 이유는이 방식으로 매핑 된 개체를 참조 할 때 하위 쿼리가 참조 된 ID로 인해 제한되지 않는 이유입니다. 이것은 대단히 비효율적 인 것 같아 걱정하고 있습니다. Companies 및 People 테이블의 레코드 수가 증가함에 따라 각 테이블에서 모든 항목을 선택하는 데 오랜 시간이 걸립니다. Parties 객체의 id로 하위 쿼리를 제한하기 만하면 모든 레코드가 아닌 각 테이블의 특정 레코드를 가져 와서 이후에 제한 할 수 있습니다. 더 나은 SQL이 발생하는 점을 설명하기 위해
은 약 :
select this_.Id as Id2_0_,
this_.FirstName as FirstName3_0_,
this_.CompanyName as CompanyN1_4_0_,
this_.clazz_ as clazz_0_
from (select Id,
FirstName,
null as CompanyName,
1 as clazz_
from People
union all
select Id,
null as FirstName,
CompanyName,
2 as clazz_
from Companies) this_
where Id = 123
특정 파티를 참조 왜 안
select this_.Id as Id2_0_,
this_.FirstName as FirstName3_0_,
this_.CompanyName as CompanyN1_4_0_,
this_.clazz_ as clazz_0_
from (select Id,
FirstName,
null as CompanyName,
1 as clazz_
from People
where Id = 123
union all
select Id,
null as FirstName,
CompanyName,
2 as clazz_
from Companies
where Id = 123) this_
두 번째는보다 효율적이고 적절한 인덱싱을한다고 가정 보인다 생성 된 SQL입니다 성장하는 회사 및 인력 표에 해를 끼치 지 마십시오. 이 질문은 내 질문에 대한 추가 연구에 의해 촉발되었습니다 : how to map a UnionSubclass so queries generated from it are limited.
첫 번째 쿼리의 실행 계획을 확인 했습니까? 나는 유사한 시나리오에서 SQL Server가 쿼리를 최적화하는 데 놀랍도록 잘되어 있고 전체 테이블 (또는 인덱스) 스캔을 수행해서는 안된다는 것을 알았습니다. 어쩌면 그게 NHibernate가 의존하는 것입니다. 이것은 아마도 다른 RDBMS에도 적용될 것입니다. –
@GertArnold 저는 실제로 그렇게했으며 SQL Server가 쿼리를 최적화 한 것을보고 놀랐습니다. 그 점을 지적 해 주셔서 감사합니다. 귀하의 의견을 답장으로 남겨 주시면 기꺼이 투표하여 답변으로 표시해 드리겠습니다. – ahsteele
감사합니다. @ahsteele, 그랬습니다. –