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

优化nhibernate查询

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

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

    我在下面列出的标准。在我的本地设置上运行大约需要500毫秒,这需要等待用户很多时间。有人知道我如何优化这个吗?感谢您提供的任何帮助,使本次查询更快!

    (为了隐私起见,我更改了收藏的名称:)

    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 回复  |  直到 14 年前
        1
  •  1
  •   Chris Marisic    14 年前

    我可以推荐的第一件事是启动SQL事件探查器,并获取即将到来的SQL的准确副本。然后我会把它放在SQL调优器中,这很可能会建议您创建新的索引,并在一些或所有表上添加/更新统计信息。

    在这一点上,我将在尝试调优HQL之前运行性能测试。

        2
  •  2
  •   asgerhallas    14 年前

    过了一会儿,我终于意识到,对于这个具体的场景,使用MongoDB之类的面向文档的数据库或对象数据库可能更有意义。

    这样我就可以一次加载整个聚合,而忽略联接。

    因此,对于遇到类似上述场景的任何人,请考虑使用面向文档的方法。

    我最初的测试显示了我的承诺:)

    MongoDB的介绍如下: http://mookid.dk/oncode/archives/1057