2011-11-23 1 views
2

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.

+0

첫 번째 쿼리의 실행 계획을 확인 했습니까? 나는 유사한 시나리오에서 SQL Server가 쿼리를 최적화하는 데 놀랍도록 잘되어 있고 전체 테이블 (또는 인덱스) 스캔을 수행해서는 안된다는 것을 알았습니다. 어쩌면 그게 NHibernate가 의존하는 것입니다. 이것은 아마도 다른 RDBMS에도 적용될 것입니다. –

+0

@GertArnold 저는 실제로 그렇게했으며 SQL Server가 쿼리를 최적화 한 것을보고 놀랐습니다. 그 점을 지적 해 주셔서 감사합니다. 귀하의 의견을 답장으로 남겨 주시면 기꺼이 투표하여 답변으로 표시해 드리겠습니다. – ahsteele

+0

감사합니다. @ahsteele, 그랬습니다. –

답변

1

첫 번째 쿼리의 실행 계획을 확인 했습니까?

비슷한 시나리오에서 SQL Server는 쿼리를 최적화하는 데 놀랍도록 뛰어 났으며 전체 테이블 (또는 인덱스) 스캔을 수행해서는 안된다는 것을 알았습니다. 일반적으로 쿼리 된 테이블의 관련 인덱스를 찾습니다. 어쩌면 그게 NHibernate가 의존하는 것입니다. 이것은 아마도 다른 RDBMS에도 적용될 것입니다.

관련 문제