鸡肋###
鸡肋(Chicken ribs),现代汉语词语,出自《三国志·魏书·武帝纪》裴松之注引《九州春秋》曰:“夫鸡肋,弃之如可惜,食之无所得,以比汉中,知王欲还也。”(食之无肉,弃之不舍) https://baike.baidu.com/item/鸡肋/206189
相信小伙伴们都知道这个词的典故。
那么,继续上一个彩蛋篇,让我来继续解释一下, 鸡肋乎 的说法,又是怎么一回事。
(本篇例子的源代码,可以在 https://github.com/kentliu2007/EFCoreDemo/tree/master/OwnedEntityTypes 下载。建议可以下载之后对照着代码来阅读本篇。我用的是VS2017)
为什么我们要做Table Split####
为什么我们要做Table Split?一切都是为了性能。
当今的关系型数据库产品,例如Oracle,或者SQL Server,哪怕你的Select命令,只返回一条记录里面的一个字段的内容,它的数据库引擎,都会从磁盘读取最小单位的块(Block)到内存里,然后再从内存里的N条记录中,过滤出你要的那条记录的那个字段,然后返回给你。
所以如果我们的数据表,每行的长度很长的情况下(例如拥有很多很多的字段,或者某几个字段特别的长),一个最小单位的块,能保存的记录行数就相对的少了。然后如果我们要查询和计算的记录行数比较多的话,数据库需要从磁盘读取的块,就相应地多了很多。从而影响性能。
针对这种情况,我们通常会对数据表进行纵向切割。对表的字段,按照某个方式,分门别类地,陆陆续续地把某些字段分离到另外一些表里面。例如,我们可以把存放着地址的那些长字段弄到另外一个表,当程序需要用到地址资料的时候才去访问这个表。这样,性能就提升上来了。
这个做法,就是Table Split。
EFCore Owned Entity Types对Table Split的支持####
如果看了上一篇,大家就可以知道,通过两个Entity,分别ToTable到两个不同的Table,且最后我们是统一通过Client这个类来访问所有属性,其实已经实现了对Table Split的支持。
当然,通过访问Client.ContactInfo属性才可以访问到电话号码、电子邮件,这样的方式有点不够便利。所以我们还可以进一步通过捣弄 getter/setter的把戏,直接通过Client.CellPhoneNo或者Client.Email的方式来获取联系资料。
具体请看下面的程序:
- 项目
- 代码
看,这样处理之后,是不是很方便呢?
性能####
等等,刚才不是说了,做Table Split就是为了性能吗?主要是我们希望可以纵向切割数据表之后,程序在需要的时候,才去访问相应的数据表,通过这个做法来提升性能。例如如果程序没有需要访问地址资料的需求,那么就不会去访问存放地址资料的数据表。
Owned Entity Types有能够做到这个效果吗?让我们用SQL Server Profiler来监视一下,上面的程序,它是怎样访问数据表的。
上面的Unit Test程序,实际上,它发出是SQL命令如下:
- 前两条Insert命令,没毛病:
- 最后两条Delete,也没毛病
- 中间的那条Select命令,就透露着 诡异 了:
这个相当于在程序里面用了Include()命令的做法,是Eager Loading啊。
那么没有实现程序在需要的时候,才去访问相应数据表的效果啊。
其实我们是希望在程序运行到
var x = context.Clients.FirstOrDefault(e => e.Code == code);
的时候,它只访问Client表。
然后接着程序运行到
Assert.AreEqual(x != null && x.Email == email, true);
的时候,它才去访问ClientContactInfo表。
现在的情况是,当运行context.Clients.FirstOrDefault(e => e.Code == code);的时候,其实它就已经用Left Join的方式,把Client表和ClientContactInfo两个表都同时访问了。
所以如果用了Owned Entity Types来支持Table Split的话,对性能是没有提升的。
在我之前的EFCore系列的博客里,有一篇如何用EFCore Lazy Loading实现Entity Split。通过阅读那篇博客,你就可以看到,用EFCore的Lazy Loading,其实我们是可以用着同样的捣弄getter/setter的伎俩,通过walk around的形式来支持Table Split,同时实现了程序在需要的时候,才去访问相应数据表,从而达到原先希望提升系统性能的初衷。(当然,也建议你去下载之前的代码,自己去运行SQL Server Profiler来验证一下EFCore Lazy Loading的运行机制)
所以,对比着我的上一篇博客,我们回过头来看Owned Entity Types,同样是支持Table Split,但是用Lazy Loading的话有着更好的系统性能,那么,你有没有感觉到 鸡肋 的感觉呢?
EFCore Owned Entity Types,彩蛋乎?鸡肋乎?之鸡肋篇的更多相关文章
-
EFCore Owned Entity Types,彩蛋乎?鸡肋乎?之彩蛋篇
EFCore Owned Entity Types的定义 EFCore Owned Entity Types的文档在这里:https://docs.microsoft.com/zh-cn/ef/cor ...
-
EF Core 新特性——Owned Entity Types
Owned Entity Types 首先owned entity type是EF Core 2.0的新特性. 至于什么是owned entity types,可以先把他理解为EF Core官方支持的 ...
-
实现了一个百度首页的彩蛋——CSS3 Animation简介
在百度搜索中有这样一个彩蛋:搜索“旋转”,“跳跃”,“反转”等词语,会出现相应的动画效果(搜索“反转”后的效果).查看源码可以发现,这些效果正是通过CSS3的animation属性实现的. 实现这个彩 ...
-
Spring Boot -- 启动彩蛋
使用Spring Boot启动的jar包总是会显示一个Spring的图标: . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\_ ...
-
Chrome 中的彩蛋,一款小游戏,你知道吗?
今天看到一篇文章,介绍chrome中的彩蛋,带着好奇心进去看了一眼,没想到发现了一款小游戏,个人觉得还不错,偶尔可以玩一下,放松放松心情!^_^ 当 Chrome 无法连接到互联网时, 或者上着网突然 ...
-
淘宝首页源码藏美女彩蛋(上)(UED新作2013egg)
今日,偶尔翻看淘宝源码,发现竟有美女形状源码.如下图: 此段代码在console中运行,结果更为惊叹. 亲手尝试的读者已经看到了代码运行的结果.taobao.com的console打印出了UED的招聘 ...
-
淘宝首页源码藏美女彩蛋(下)(UED新作2013egg)
我们已经知道,执行美女会得到"彩蛋",而正是彩蛋做到了taobaoUED展现给大家的神奇的前端魅力.今天我们来看看FP.egg&&FP.egg("%cjo ...
-
[深入浅出Windows 10]模拟实现微信的彩蛋动画
9.7 模拟实现微信的彩蛋动画 大家在玩微信的时候有没有发现节日的时候发一些节日问候语句如“情人节快乐”,这时候会出现很多爱心形状从屏幕上面飘落下来,我们这小节就是要模拟实现这样的一种动画效果.可能微 ...
-
阻止PHP彩蛋信息泄漏 [转]
Easter Eggs(复活节彩蛋)外行人估计不了解这是神木玩意,彩蛋的网络解释是:用于电脑.电子游戏.电脑游戏.影碟或其他互动多媒体之中的隐藏功能或信息.PHP包含一个安全漏洞,可能导致未经授权的信 ...
随机推荐
-
hdoj (1162) 最小生成树
Problem B Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Sub ...
-
Redis源代码分析(十)--- testhelp.h小测试框架和redis-check-aof.c
日志检测
周期分析struct结构体redis代码.最后,越多越发现很多的代码其实大同小异.于struct有袋1,2不分析文件,关于set集合的一些东西,就放在下次分析好了,在选择下个分析的对象时,我考虑了一下 ...
-
POJ1222熄灯问题
千年老题,以前用枚举做,现在用高斯消元做 *元直接做成0即可 #include<cstdio> #include<cstdlib> #include<algorithm ...
-
解决 phpstorm 运行卡,自动关闭等问题
解决 phpstorm 自动关闭问题: 使用文件搜索工具(可在本博客搜索“管理工具”,或查找安装目录) 找到phpstorm.vmoptions文件,使用记事本打开. 添加以下两行代码: -Dawt. ...
-
按某个属性排序(字典序,ascII) js/python
javascrapy方法 var compare = (prop)=>{ return (a,b)=>{ : - } } javascrapy测试代码 var aaa = [ {name: ...
-
第12章 网络基础(1)_网络分层和TCP/IP协议族
1. 协议的概念 (1)计算机网络中实现通信必须有一些约定.如对速率.传输代码.代码结构.传输控制步骤和出错控制等约定,这些约定即被称为通信协议 (2)在两个节点之间要成功地进行通信,两个节点之间必须 ...
-
RocketMQ 自己的整理和理解
每个人的想法不同, RocketMQ 介绍的时候就说 是阿里从他们使用的上 解耦出来 近一步简化 便捷的 目的当然是 让其能快速入手和开发 如果不是在项目设计层面上 只是使用的话 从Git上下载该项目 ...
-
delphi 调用 java
1.设置JVM路径 FJavaVM := TJavaVM.Create(JNI_VERSION_1_6, 'C:\Program Files\Java\jre6\bin\server\jvm. ...
-
NOJ——1658平方和(自然数平方和公式和取模法则)
[1658] 平方和 时间限制: 1000 ms 内存限制: 65535 K 问题描述 给你两个数n和m,求从6开始到6*n的等差数列(差值为6)的每一项的平方的和除6模m的值 (例如n=2,m=3, ...
-
hihoCoder 数组重排
找每个位置循环节的大小. 得到结果d1, d2, ....., dn. 最终结果cmd(d1, d2, ...., dn). 水题. 题目链接: http://hihocoder.com/contes ...