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中设置这些东西!
NHibernate查询优化的相关资料的更多相关文章
- 全文检索解决方案(lucene工具类以及sphinx相关资料)
介绍两种全文检索的技术. 1. lucene+ 中文分词(IK) 关于lucene的原理,在这里可以得到很好的学习. http://www.blogjava.net/zhyiwww/archive/ ...
- React Test相关资料
karma 前端测试驱动器,生产测试报告,多个浏览器 mocha js的测试框架,相当于junit chai,单元测试的断言库,提供expect shudl assert enzyme sinon.j ...
- iOS10以及xCode8相关资料收集
兼容iOS 10 资料整理笔记 源文:http://www.jianshu.com/p/0cc7aad638d9 1.Notification(通知) 自从Notification被引入之后,苹果就不 ...
- Nao 类人机器人 相关资料
Nao 类人机器人 相关资料: 1.兄妹 PEPPER :在山东烟台生产,http://www.robot-china.com/news/201510/30/26564.html 2.国内机器人领先公 ...
- GBrowse配置相关资料
GBrowse配置相关资料(形状.颜色.配置.gff3) http://gmod.org/wiki/Glyphs_and_Glyph_Optionshttp://gmod.org/wiki/GBrow ...
- AssetBundle机制相关资料收集
原地址:http://www.cnblogs.com/realtimepixels/p/3652075.html AssetBundle机制相关资料收集 最近网友通过网站搜索Unity3D在手机及其他 ...
- 转:基于IOS上MDM技术相关资料整理及汇总
一.MDM相关知识: MDM (Mobile Device Management ),即移动设备管理.在21世纪的今天,数据是企业宝贵的资产,安全问题更是重中之重,在移动互联网时代,员工个人的设备接入 ...
- smb相关资料
smb相关资料 看资料就上维基 https://en.wikipedia.org/wiki/Server_Message_Block#Implementation http://www.bing.co ...
- Linux命令学习总结之rmdir命令的相关资料可以参考下
这篇文章主要介绍了Linux命令学习总结之rmdir命令的相关资料,需要的朋友可以参考下(http://www.nanke0834.com) 命令简介: rmdir命令用用来删除空目录,如果目录非空, ...
随机推荐
- Cisco交换机基础命令 + Win Server08 R2 多网卡配置链路聚合
最近捣鼓服务器链路集合需要配置交换机… 以前没弄过交换机,现学现卖… 一般交换机是支持telnet的,配置好ip可以直接telnet,当然如果没配的话就要用串口了,串口要选择Serial… 还好我们万 ...
- js条件语句初步练习
var a=18 if(a<10){ alert("便宜") } else{ ...
- Telnet和SSH
1. 协议用途 Telnet和SSH用于远程访问服务器的的两大常用协议.利用它们,我们可以管理并监控生产服务器和企业服务器,更新服务器内核,安装最新的软件包和补丁,能够远程登录服务器,开展软件开发.测 ...
- Codeforces Gym100783H 最短路 其他
原文链接https://www.cnblogs.com/zhouzhendong/p/CF-Gym100783H.html 题目传送门 - CF-Gym100783H 题意 给定一个 $n$ 个节点 ...
- BZOJ4553/洛谷P4093 [HEOI2016/TJOI2016]序列 动态规划 分治
原文链接http://www.cnblogs.com/zhouzhendong/p/8672434.html 题目传送门 - BZOJ4553 题目传送门 - 洛谷P4093 题解 设$Li$表示第$ ...
- ajax请求后台,response.sendRedirect失效,无法重定向
今天在写项目的时候,想加一个切换用户,需要清除session并且跳转到登录页面,发起一个ajax请求后,执行完发现无法跳转. 原因在于: (从网上摘录) Ajax只是利用脚本访问对应url获取数据而已 ...
- 进程,线程,协程,io多路复用 总结
并发:要做到同时服务多个客户端,有三种技术 1. 进程并行,只能开到当前cpu个数的进程,但能用来处理计算型任务 ,开销最大 2. 如果并行不必要,那么可以考虑用线程并发,单位开销比进程小很多 线程: ...
- HDU 3488 Tour (最大权完美匹配)【KM算法】
<题目链接> 题目大意:给出n个点m条单向边边以及经过每条边的费用,让你求出走过一个哈密顿环(除起点外,每个点只能走一次)的最小费用.题目保证至少存在一个环满足条件. 解题分析: 因为要求 ...
- Codeforces 300C Beautiful Numbers 【组合数】+【逆元】
<题目链接> 题目大意: 给出a和b,如果一个数每一位都是a或b,那么我们称这个数为good,在good的基础上,如果这个数的每一位之和也是good,那么这个数是excellent.求长度 ...
- 从零搭建 ES 搜索服务(二)基础搜索
一.前言 上篇介绍了 ES 的基本概念及环境搭建,本篇将结合实际需求介绍整个实现过程及核心代码. 二.安装 ES ik 分析器插件 2.1 ik 分析器简介 GitHub 地址:https://git ...