代码之家  ›  专栏  ›  技术社区  ›  asgerhallas

优化NHibernate查询

  •  0
  • asgerhallas  · 技术社区  · 16 年前

    在我的系统中,我对一个有很多集合的聚合进行集中计算。我需要在计算之前加载所有集合,因此我使用了一个在根上连接集合的多标准。

    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));
    
    2 回复  |  直到 16 年前
        1
  •  1
  •   Chris Marisic    16 年前

    这样我就可以一次性加载整个聚合,而忘记连接。

    因此,对于遇到上述情况的人来说,可以考虑使用面向文档的方法。

    我的初步测试显示了希望:)

    http://mookid.dk/oncode/archives/1057

        2
  •  2
  •   asgerhallas    16 年前

    我建议的第一件事是启动您的Sql Profiler并获取传入的Sql的精确副本。然后,我会将其放入Sql Tuner中,这很可能会建议创建新的索引并添加/更新部分或所有表的统计信息。

    在这一点上,我会先进行性能测试,然后再尝试对HQL进行性能调优。