最近主导了旗下某核心项目升级到EfCore3

由于之前Core2升级时候也踩过不少的坑很多东西都有规划和准备,整体上还是没出太大问题

但是最近突然发现efcore对于使用了ownedType的生成语句有问题

查找了一下资料发现已经有人在efcore的github上开了issus了,并且还讨论的蛮多的了

https://github.com/dotnet/efcore/issues/18299

鉴于很多人看到一堆E文后会直接放弃,下面我简单阐述下这个问题

EfCore自2.0的时候引入了一个叫OwnedType的特性,是用于完善之前EfCore1.x相比于Ef6使其少了的ComplexType特性

正常来说我们用Ef的时候是一个类映射到一个表,但是有时候某些表字段过多的情况下,我们可能会想整理下把一个表里某些信息放到一个子类里,但是其他信息还是在主类

形如

class Order
{
public int Id { get; set; }
public string Title { get; set; }
public Address Address { get; set; }
} class Address
{
public string Street { get; set; }
public string City { get; set; }
}

然后DbContext里配置下  
modelBuilder.Entity<Order>().OwnsOne(x => x.Address);  

这种情况下最理想生成的语句应该是类似  
select Id,Title,Street,City from Orders
 这个样子的形式才对,然后EfCore内部再通过自己映射的形式把后面4个字段映射到Author类里的Address这个类里

但是在EfCore3里他生成的语句是形如  
SELECT o."Id", o."Title", t."Id", t."Address_City", t."Address_Street"
FROM "Orders" AS o
LEFT JOIN (
SELECT o0."Id", o0."Address_City", o0."Address_Street", o1."Id" AS "Id0"
FROM "Orders" AS o0
INNER JOIN "Orders" AS o1 ON o0."Id" = o1."Id"
WHERE (o0."Address_Street" IS NOT NULL) OR (o0."Address_City" IS NOT NULL)
) AS t ON o."Id" = t."Id"
WHERE (t."Id" IS NULL)

尽管严格来说这个并不影响逻辑,但是这样子join的话对Sql的性能和效率有挺不好的负面影响

就那个issus里也有人做了测试,结果下图

纵坐标是每秒执行的查询数(简单理解为并发数吧)

横坐标是表里有多少数据

可以看到表的数据量上升之后使用了OwnedType的EfCore3会出现显著下滑(自己join自己多了)

接下来就是一个好消息和一个坏消息了

好消息是EfCore那边认可了这个问题然后当前EfCore 5 preview-3修复了这个问题

坏消息是至少目前确认这个修复不会合并到EfCore3.1.x(后期会不会有变数不清楚)

感觉这个蛮坑的,一般公司用的话都会是优先选用LTS,而当前的LTS就是3.1

而接下来的NetCore5(含EfCore5)并不是LTS所以对于公司组织的线上采用率应该会相对较低

那难道修复这个问题还要等一个目前还没规划的NetCore5.1?那是不是要等的有点儿太久了

最后,如果有升级EfCore3的且用了OwnedType(相当于Ef6时期的ComplexType)请谨慎评估下这个问题对你可能造成的影响

毕竟目前看起来,降级回去不大可能,烧香保佑下fix path能到3.1.x要么就只能指望Core5.1了

EfCore3的OwnedType会导致Sql效率问题的更多相关文章

  1. 【转】导致SQL执行慢的原因

    索引对大数据的查询速度的提升是非常大的,Explain可以帮你分析SQL语句是否用到相关索引. 索引类似大学图书馆建书目索引,可以提高数据检索的效率,降低数据库的IO成本.MySQL在300万条记录左 ...

  2. 导致SQL执行慢的原因

    索引对大数据的查询速度的提升是非常大的,Explain可以帮你分析SQL语句是否用到相关索引. 索引类似大学图书馆建书目索引,可以提高数据检索的效率,降低数据库的IO成本.MySQL在300万条记录左 ...

  3. [MySQL优化] -- 如何查找SQL效率地下的原因

    [MySQL优化] -- 如何查找SQL效率地下的原因   来源: ChinaUnix博客 日期: 2009.07.20 16:12 (共有条评论) 我要评论       查询到效率低的 SQL 语句 ...

  4. 存储过程为什么比sql效率高

    对于存储过程为什么比sql效率高的原因有4点 第一就是使用存储过程允许组建式编成, 二是可以对程序进行编译,

  5. 最新版SEMCMS_PHP_3.5 过滤不严导致sql注入

    一.漏洞分析 在分析过程中看到网上已经有人发现semcms V2.4存在过滤不严导致sql注入的漏洞,不知道咋还没改,而且最新版过滤的关键字更少了. 首先查看首页文件index.php的代码 < ...

  6. 服务器重启可能会导致SQL Server中部分数据库变为single user mode

    今天检查公司生产服务器的SQL Server数据库,惊讶的发现有三个生产数据库变为了single user mode.奇怪的是没有任何人和程序执行过SQL语句将这三个数据库设置为single user ...

  7. Drupal V7.3.1 框架处理不当导致SQL注入

    这个漏洞本是2014年时候被人发现的,本着学习的目的,我来做个详细的分析.漏洞虽然很早了,新版的Drupal甚至已经改变了框架的组织方式.但是丝毫不影响对于漏洞的分析.这是一个经典的使用PDO,但是处 ...

  8. 修改Windows帐户密码,导致Sql Server 2000无法启动

    修改Windows帐户密码,导致Sql Server 2000无法启动. --现象以管理员或同等权限用户登录 Windows XP,建立 Sql Server 2000 数据库.之后,在修改此 Win ...

  9. 12.1.0.2自适应特性导致SQL性能下降

    背景介绍 在升级到12.1.0.2.0数据库版本后,在使用12c中引入的自适应特性默认配置的情况下,可能引起SQL性能的下降. 问题现象升级到12.1.0.2.0后,SQL语句性能可能出现下降. 影响 ...

随机推荐

  1. 基于Goc的Golang代码VSCode实时染色方案

    近日,Li Yiyang 老师基于Goc做了个VS Code插件,能够直观的看到被执行到的代码,当真充满想象力: 感兴趣的同学可以去goc仓库查看详情. Goc的核心能力就在于能够帮助我们在被测程序运 ...

  2. Java反序列漏洞

    序列化:WriteObject 反序列化:readObject() Jd-gui.exe 最简单的打开java文件方式 Intellij idea 编辑工具 演示案例: WebGoat_Javaweb ...

  3. [LeetCode]404. 左叶子之和(递归)、938. 二叉搜索树的范围和(递归)(BST)

    题目 404. 左叶子之和 如题 题解 类似树的遍历的递归 注意一定要是叶子结点 代码 class Solution { public int sumOfLeftLeaves(TreeNode roo ...

  4. EF CodeFirst学习

    EF CodeFirst 真是时光如梦,岁月如歌,自己一不留神就被后浪拍在了沙滩上,就连我要学的这个东西也是12年就在博客园很火了. EF有三种开发模式,DatabaseFirst, ModelFir ...

  5. 使用Mysql分区表对数据库进行优化

    早期工作中没有做好足够的设计,目前记录表单表数据2000w且无有效索引,表现是分页缓慢,模糊查询拉闸. 当前业务中,写操作会多于读操作,时不时会遇到慢SQL占用过多的数据连接,导致写操作无法正常进行. ...

  6. jwt攻击手段

    jwt 秘钥泄漏/敏感文件泄漏 在一些配置文件被我们可查的情况下,包括各种文件读取,源码泄漏,此时伪造身份就变得很容易了. 空加密算法 对于明文的加密算法通常为HS256,在jwt中分为三个部分,以点 ...

  7. python 魔法方法诠释

    什么是Python魔法方法 什么是魔法方法呢?它们在面向对象的Python的处处皆是.它们是一些可以让你对类添加"魔法"的特殊方法. 它们经常是两个下划线包围来命名的(比如 ini ...

  8. GUI应用编程初体验

    不同平台的GUI实现原理是一样的. 本实验基于 windos平台. 先捋一捋概念 什么是消息队列(Message Queue)假 设一个场景:系统正在处理WM_PAINT消息,就在这时用户在键盘上敲击 ...

  9. 无所不能的Embedding 2. FastText词向量&文本分类

    Fasttext是FaceBook开源的文本分类和词向量训练库.最初看其他教程看的我十分迷惑,咋的一会ngram是字符一会ngram又变成了单词,最后发现其实是两个模型,一个是文本分类模型[Ref2] ...

  10. JDK1.8新特性之(二)--方法引用

    在上一篇文章中我们介绍了JDK1.8的新特性有以下几项. 1.Lambda表达式 2.方法引用 3.函数式接口 4.默认方法 5.Stream 6.Optional类 7.Nashorm javasc ...