2009-05-13 3 views
0

제 시스템에서는 많은 콜렉션이있는 집계에 대해 중앙 집중식 계산을 수행합니다. 모든 컬렉션을 계산 전에로드해야하므로 루트의 컬렉션에 조인하는 다중 기준을 사용합니다.NHibernate 쿼리를 최적화하십시오.

아래에 나열된 기준. 내 로컬 설정을 실행하는 데 약 500ms가 소요되며 이는 사용자를 기다리는 많은 시간입니다. 아무도 내가 어떻게 최적화 할 수있는 아이디어가 있습니까? 이 쿼리를 더 빠르게 만들 수있는 도움이 있으면 감사하겠습니다!

는 (좀 개인 정보 보호 :)의 컬렉션의 이름을 변경)

IMultiCriteria criteria = session.CreateMultiCriteria() 
.Add(DetachedCriteria.For<Building>() 
    .Add(Restrictions.Eq("Id", BuildingId)) 
    .CreateCriteria("ACollection", JoinType.LeftOuterJoin) 
.Add(DetachedCriteria.For<Building>() 
    .Add(Restrictions.Eq("Id", BuildingId)) 
    .CreateCriteria("BCollection", JoinType.LeftOuterJoin) 
.Add(DetachedCriteria.For<Building>() 
    .Add(Restrictions.Eq("Id", BuildingId)) 
    .CreateCriteria("CCollection", JoinType.LeftOuterJoin) 
.Add(DetachedCriteria.For<Building>() 
    .Add(Restrictions.Eq("Id", BuildingId)) 
    .CreateCriteria("ECollection", JoinType.LeftOuterJoin)) 
.Add(DetachedCriteria.For<Building>() 
    .Add(Restrictions.Eq("Id", BuildingId)) 
    .CreateCriteria("FCollection", JoinType.LeftOuterJoin)) 
.Add(DetachedCriteria.For<Building>() 
    .Add(Restrictions.Eq("Id", BuildingId)) 
    .CreateCriteria("GCollection", JoinType.LeftOuterJoin)) 
.Add(DetachedCriteria.For<Building>() 
    .Add(Restrictions.Eq("Id", BuildingId)) 
    .CreateCriteria("HCollection", JoinType.LeftOuterJoin)) 
.Add(DetachedCriteria.For<Building>() 
    .Add(Restrictions.Eq("Id", BuildingId)) 
    .CreateCriteria("JCollection", JoinType.LeftOuterJoin)) 
.Add(DetachedCriteria.For<Building>() 
    .Add(Restrictions.Eq("Id", BuildingId)) 
    .CreateCriteria("KCollection", JoinType.LeftOuterJoin)) 
.Add(DetachedCriteria.For<Building>() 
    .Add(Restrictions.Eq("Id", BuildingId)) 
    .CreateCriteria("LCollection", JoinType.LeftOuterJoin)) 
.Add(DetachedCriteria.For<Building>() 
    .Add(Restrictions.Eq("Id", BuildingId)) 
    .CreateCriteria("MCollection", JoinType.LeftOuterJoin)) 
.Add(DetachedCriteria.For<Building>() 
    .Add(Restrictions.Eq("Id", BuildingId)) 
    .CreateCriteria("NCollection", JoinType.LeftOuterJoin)) 
.Add(DetachedCriteria.For<Building>() 
    .Add(Restrictions.Eq("Id", BuildingId)) 
    .CreateCriteria("OCollection", JoinType.LeftOuterJoin)) 
.Add(DetachedCriteria.For<Building>() 
    .Add(Restrictions.Eq("Id", BuildingId)) 
    .CreateCriteria("PCollection", JoinType.LeftOuterJoin)) 
.Add(DetachedCriteria.For<Building>() 
    .Add(Restrictions.Eq("Id", BuildingId)) 
    .CreateCriteria("QCollection", JoinType.LeftOuterJoin)) 
.Add(DetachedCriteria.For<Building>() 
    .Add(Restrictions.Eq("Id", BuildingId)) 
    .CreateCriteria("RCollection", JoinType.LeftOuterJoin)) 
.Add(DetachedCriteria.For<Building>() 
    .Add(Restrictions.Eq("Id", BuildingId)) 
    .CreateCriteria("SCollection", JoinType.LeftOuterJoin)) 
.Add(DetachedCriteria.For<Building>() 
    .Add(Restrictions.Eq("Id", BuildingId)) 
    .CreateCriteria("TCollection", JoinType.LeftOuterJoin)) 
.Add(DetachedCriteria.For<Building>() 
    .Add(Restrictions.Eq("Id", BuildingId)) 
    .CreateCriteria("UCollection", JoinType.LeftOuterJoin)) 
.Add(DetachedCriteria.For<Building>() 
    .Add(Restrictions.Eq("Id", BuildingId)) 
    .CreateCriteria("VCollection", JoinType.LeftOuterJoin)) 
.Add(DetachedCriteria.For<Building>() 
    .Add(Restrictions.Eq("Id", BuildingId)) 
    .CreateCriteria("WCollection", JoinType.LeftOuterJoin)) 
.Add(DetachedCriteria.For<Building>() 
    .Add(Restrictions.Eq("Id", BuildingId)) 
    .CreateCriteria("XCollection", JoinType.LeftOuterJoin)) 
.Add(DetachedCriteria.For<Building>() 
    .Add(Restrictions.Eq("Id", BuildingId)) 
    .CreateCriteria("YCollection", JoinType.LeftOuterJoin)) 
.Add(DetachedCriteria.For<Building>() 
    .Add(Restrictions.Eq("Id", BuildingId)) 
    .CreateCriteria("ZCollection", JoinType.LeftOuterJoin)) 
.Add(DetachedCriteria.For<Building>() 
    .Add(Restrictions.Eq("Id", BuildingId)) 
    .CreateCriteria("AACollection", JoinType.LeftOuterJoin)) 
.Add(DetachedCriteria.For<Building>() 
    .Add(Restrictions.Eq("Id", BuildingId)) 
    .CreateCriteria("ABCollection", JoinType.LeftOuterJoin)) 
.Add(DetachedCriteria.For<Building>() 
    .Add(Restrictions.Eq("Id", BuildingId)) 
    .CreateCriteria("ACCollection", JoinType.LeftOuterJoin)) 
.Add(DetachedCriteria.For<Building>() 
    .Add(Restrictions.Eq("Id", BuildingId)) 
    .CreateCriteria("ADCollection", JoinType.LeftOuterJoin)) 
.Add(DetachedCriteria.For<Building>() 
    .Add(Restrictions.Eq("Id", BuildingId)) 
    .CreateCriteria("AECollection", JoinType.LeftOuterJoin)); 
+0

와우 ... 인상적인 –

+0

hehe에 ... 그래, 난 확실히 내가 다른 선택의 여지가 원하는 :

내 초기 테스트는 약속 :

하여 MongoDB에

하나 개 소개는 여기에서 찾을 수 있습니다 보여줍니다! :) – asgerhallas

답변

1

나는 당신의 SQL 프로파일을 발사하고 SQL의 정확한 사본을 얻을 것 추천 수 맨 처음 일 SQL Tuner에 넣으면 새로운 인덱스를 생성하고 일부 또는 모든 테이블에 통계를 추가/업데이트하는 것이 좋습니다.

이 시점에서 성능 테스트를 실행하기 전에 성능 테스트를 실행해야합니다.

2

마침내 나는이 정확한 시나리오에서 MongoDB 나 객체 데이터베이스와 같은 문서 지향 데이터베이스를 사용하는 것이 더 합리적임을 깨달았습니다.

그런 식으로 전체 집계를 하나씩로드하고 조인을 잊어 버릴 수 있습니다.

위와 같은 시나리오를 실행하는 사람이라면 문서 지향 접근 방법을 사용해보십시오. http://mookid.dk/oncode/archives/1057

관련 문제