• NHibernate查询优化的相关资料


    一.http://www.cnblogs.com/dddd218/archive/2009/09/01/1557640.html

    1.立即加载(lazy=false)并不能在所有情况下都会减少SQL语句,同时还会带来过量读取数据的严重后果
      比如,在mapping文件中为实体AEntity设置了一个关联实体BEntity,并且将这个关联设置为lazy=false,这样当加载实体AEntity时(调用Get(id)),NHibernate就会自动加载实体BEntity。通过查看NHibernate生成的sql发现NHibernate生成的是2条sql,第一条sql获取的是AEntity,第二条获取的是BEntity,所以说在这种情况下,我的理解是,lazy=false并不会减少实际执行的sql语句,只是减少了程序员编写查询(sql)的数量,适当减轻了程序员的编程负担。
      立即加载的最大好处就是关联实体或集合由NHibernate自动加载,无需程序员手工加载。但是付出的代价则是有可能导致数据的过量读取,加大数据库、网络数据传输、应用服务器的负担,举例如下:
    (1)多对一的关联实体立即加载:比如当前某个操作仅需获取AEntity而不需要获取BEntity的详细信息,由于立即加载,导致在加载AEntity的同时加载BEntity,如果BEntity还关联了CEntity而且也是立即加载,那么NHibernate同时还会加载CEntity,如果CEntity还关联了……
    (2)一对多的关联集合立即加载:如果关联的数据是一个集合,并且集合数据很多(比如集合中有成千上万条数据),那么一次性立即加载整个关联集合数据的开销是显而易见的。
    (3)类(class)级别的lazy=false:上面提到的两种情况是把lazy=false设置在关联级别上(细粒度),如果把lazy=false设置在整个class上(大粒度),那么情况将更加糟糕,这样当加载该类实体时会同时加载所有关联的实体和集合。

    2.所有的关联实体和关联集合最好都保持默认的延迟加载
      由上面的分析可知,关联实体和集合最好保持默认的延迟加载,所以我在实际的开发中是不进行任何lazy=false设置的。如果要同时加载关联实体或集合,最有效的方法就是编写join和 dynamic fetching join的查询操作,这既可以减少所需执行的sql语句(join操作可以在一条语句中获取多个关联实体(关联数据表)或关联实体的properties(字段), 这是由join这类关系操作的本质决定的),同时按需获取数据避免数据的过量加载。

    3. 普通join与 dynamic fetching join的区别
      刚开始使用NHibernate时,以为join与 dynamic fetching join是一回事,后来才明白两者的区别。我的理解,说得简单一点就是,dynamic fetching join会在一条sql语句中获取关联实体和/或关联集合数据,并把它(们)装配(marshal)成完整的persistent entity。而join会在一条sql语句中可以仅获取关联实体的某个property或某几个properties,而不一定是一个完整的persistent entity。具体join与 dynamic fetching join操作请参见在线文档。

    4. 尽量避免在mapping文件中进行如下这些设置
      如:lazy="false"(立即加载), fetch="subselect"(子查询抓取),batch-size="20"(批量抓取),fetch="join"(关联抓取)等,因为在 mapping文件中的设置是global设置,会对整个系统产生全局性的影响。而且有些设置对Get、Load、HQL和Criteria都产生影响,而有些设置对HQL不影响对Criteria有影响。举个例子,当分别执行同样功能的HQL和Criteria时,却得到不同的查询结果时,你或许会感到非常惊讶;当对此问题进行了一天一夜的调试和冥思苦想之后,突然发现是由于mapping文件中的某个设置导致HQL和Criteria的差异时,你一定会气得想把电脑给砸了,并发誓永不再在mapping中设置这些东西!

  • 相关阅读:
    外校培训前三节课知识集合纲要(我才不会告诉你我前两节只是单纯的忘了)
    floyd算法----牛栏
    bfs开始--马的遍历
    (DP 线性DP 递推) leetcode 64. Minimum Path Sum
    (DP 线性DP 递推) leetcode 63. Unique Paths II
    (DP 线性DP 递推) leetcode 62. Unique Paths
    (DP 背包) leetcode 198. House Robber
    (贪心 复习) leetcode 1007. Minimum Domino Rotations For Equal Row
    (贪心) leetcode 452. Minimum Number of Arrows to Burst Balloons
    (字符串 栈) leetcode 921. Minimum Add to Make Parentheses Valid
  • 原文地址:https://www.cnblogs.com/hyl8218/p/7493948.html
Copyright © 2020-2023  润新知