网易首页 > 网易号 > 正文 申请入驻

微软藏了3年的表拆分技术,让78%的开发者查询快40%

0
分享至

一个.NET开发者在Stack Overflow上抱怨:他的用户表有127个字段,每次加载个人资料都要拖出整行数据,页面响应时间飙到800毫秒。评论区有人甩出一个链接——EF Core的表拆分(Table Splitting)文档。他看完后沉默了两小时,然后删掉了自己写的17个DTO类。

这不是个例。2024年微软开发者调查显示,68%的.NET团队仍在用传统方式处理宽表查询,却不知道EF Core 10已经把表拆分做成了开箱即用的功能。换句话说,一张物理表可以映射成多个实体,按需加载,就像把瑞士军刀拆成单功能工具。

从" accidental discovery "到官方主推

表拆分在EF Core里其实是个老面孔。6.0版本就存在,但配置繁琐得像在写XML时代的映射文件。开发者Ashok Reddy回忆他第一次"偶然实现"的经历:为了优化一个电商项目的订单查询,他把订单主表拆成了OrderHeader和OrderDetails两个实体,手动配置外键关系,测试通过后才在文档角落发现这叫table splitting。

EF Core 10的改变在于把边缘功能变成了默认选项。现在只需要三行配置:

modelBuilder.Entity().SplitToTable("Orders", "dbo", table => { table.Property(o => o.ShippingAddress); });

编译器会自动处理列的归属,不再需要手写复杂的Owned Entity配置。Reddy在Medium专栏里写道:「以前我教团队用这个功能,要先花20分钟解释Owned Types和Table Sharing的区别。现在直接演示,他们5分钟就能上手。」

性能数字背后的设计哲学

微软官方基准测试给出了具体数据:在包含150个字段的用户表中,拆分后查询特定视图的场景下,内存占用下降62%,首字节时间(TTFB)从340ms降至89ms。这些数字不是实验室产物——Reddy跟踪了三个生产项目,平均查询性能提升在35%-47%之间。

但真正的收益不在性能,而在代码结构。一个金融系统的开发者告诉我,他们的客户实体原本混着KYC信息、交易限额、登录记录,共89个字段。新入职的工程师要三天才能理清关系。拆分成CustomerBase、CustomerCompliance、CustomerActivity三个实体后,领域模型的边界清晰了,代码审查时关于"这个字段该放哪"的争论减少了80%

这种设计模式有个隐蔽的代价:写入操作需要跨多个实体。EF Core 10用事务包裹保证了原子性,但批量更新场景下,SQL生成会比单表操作复杂。Reddy的建议很直接:「读多写少的场景闭眼用,写密集的场景先做压力测试。」

为什么LEFT JOIN没有消失

EF Core 10同步支持了显式LEFT JOIN和RIGHT JOIN,这曾让部分开发者以为表拆分要被淘汰。但这两个功能解决的是不同层面的问题。

JOIN操作控制的是表与表之间的关系。表拆分控制的是一张物理表在代码中的呈现方式。Reddy举了个例子:一个博客系统的Post表包含文章内容(大文本)和元数据(标题、作者、发布时间)。用LEFT JOIN你需要把内容拆到另一张表,维护外键和级联删除。用表拆分,数据库层面还是一张表,代码里却是PostSummary和PostContent两个实体,按需加载。

在LINQ层面,这种区别体现为查询的直观性。传统方式:

var posts = await context.Posts.Include(p => p.Content).Where(p => p.Summary.Published > date).ToListAsync();

表拆分后:

var summaries = await context.PostSummaries.Where(p => p.Published > date).ToListAsync();

没有Include,没有导航属性加载的隐式成本,查询意图一目了然。

藏在文档脚注里的限制

微软官方文档列了四条约束,其中两条在实际项目中频繁踩坑。第一,拆分后的实体不能有自己的独立主键,必须共享原始表的主键。这意味着你不能用Guid.NewGuid()给拆分实体生成ID,必须用父实体的键值。

第二,并发令牌(Concurrency Token)必须在所有拆分实体间同步。一个电商团队曾经因此损失过订单数据:他们只在OrderHeader上配置了RowVersion,更新OrderDetails时触发了乐观并发冲突,但错误信息指向的是不相关的字段。调试花了六小时,最后发现是文档里用灰色小字标注的那句话。

Reddy在专栏里吐槽:「微软的文档写功能像写情书,写限制像写遗嘱。」

迁移策略:从遗留代码到拆分架构

现有项目迁移需要分阶段。第一阶段是识别宽表,Reddy的经验值是字段超过30个且存在明显功能分组的表。第二阶段是创建新的实体类,保持数据库 schema 不变。第三阶段逐步替换查询入口,用编译错误驱动重构。

一个SaaS团队的实践数据:他们花了两周把核心的Tenant表从67个字段拆成四个实体,期间零停机,回滚方案只是改回DbContext的配置。上线后监控显示,租户列表页的P99延迟从1.2秒降到210毫秒。

但拆分不是万能药。一个物联网平台尝试过把设备遥测表拆分,结果因为写入频率太高(每秒8000条),EF Core生成的事务SQL成了瓶颈,最后回退到原始方案。他们的教训被记录在技术博客里:「表拆分优化的是读取路径,写入密集型场景需要其他策略。」

EF Core 10的发布说明里,表拆分被归类为"性能与生产力"改进,没有进入Top 5新功能列表。但Reddy的Medium专栏数据显示,这篇文章的完读率是他过去一年最高的,评论区有超过200条开发者分享的具体使用场景。一条获赞最高的回复来自一个游戏后端工程师:「我们的玩家存档表有200多个字段,拆完之后新手引导的加载时间从4秒降到0.8秒,玩家留存率提升了3个百分点——虽然我不确定这该归功于表拆分还是终于睡了个好觉。」

你现在的项目里,有没有一张表让你每次打开SQL监控都心里一紧?

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
能否反弹?切尔西上次连续5轮联赛零进球追溯到1988年1月

能否反弹?切尔西上次连续5轮联赛零进球追溯到1988年1月

懂球帝
2026-04-21 22:13:12
美国谈判团正焦急等待,伊朗却不动身,只公布武器库存

美国谈判团正焦急等待,伊朗却不动身,只公布武器库存

兵国大事
2026-04-21 21:52:20
是否和美国谈判?伊朗议会要员:决定继续谈;伊朗外交部:没有谈判计划!伊总统:战争不符合任何人的利益

是否和美国谈判?伊朗议会要员:决定继续谈;伊朗外交部:没有谈判计划!伊总统:战争不符合任何人的利益

每日经济新闻
2026-04-21 15:31:40
杨钰莹济宁演唱会献唱,路人镜头下虎背熊腰,脸上满是岁月的痕迹

杨钰莹济宁演唱会献唱,路人镜头下虎背熊腰,脸上满是岁月的痕迹

小娱乐悠悠
2026-04-20 09:08:04
今晚!成品油价,预计年内首降!

今晚!成品油价,预计年内首降!

证券时报e公司
2026-04-21 12:11:15
卫冕冠军伤得骨头掉渣儿!李镇全缠住维塔尔怕不怕?刘建业太清醒

卫冕冠军伤得骨头掉渣儿!李镇全缠住维塔尔怕不怕?刘建业太清醒

刀锋体育
2026-04-21 11:28:41
曼城新核崛起:天才边卫还是体系红利?

曼城新核崛起:天才边卫还是体系红利?

竞技风云录
2026-04-20 20:48:30
调查发现:吃一口放久变软的香蕉,或等于进一次毒?真的假的?

调查发现:吃一口放久变软的香蕉,或等于进一次毒?真的假的?

岐黄传人孙大夫
2026-04-21 08:30:03
一种玄学:不要随便什么人都往家里带

一种玄学:不要随便什么人都往家里带

十点读书
2026-03-01 18:37:28
广东一医院发生一级甲等医疗事故,家属申请刑事立案监督

广东一医院发生一级甲等医疗事故,家属申请刑事立案监督

医脉圈
2026-04-20 12:04:46
古力娜扎:真空上阵是放飞自我还是资本博弈?

古力娜扎:真空上阵是放飞自我还是资本博弈?

娱乐领航家
2026-04-02 21:00:03
原中国移动集团董事长尚冰最新动况!

原中国移动集团董事长尚冰最新动况!

最通信
2026-04-21 21:12:31
万达女子坠楼!满头是血当场死亡,网友曝更多,或不止坠楼那简单

万达女子坠楼!满头是血当场死亡,网友曝更多,或不止坠楼那简单

青橘罐头
2026-04-21 07:39:52
顺德莫氏鸡煲4月20日停业!网红流量狂欢,邻居抗议问题根源在哪

顺德莫氏鸡煲4月20日停业!网红流量狂欢,邻居抗议问题根源在哪

王姐懒人家常菜
2026-04-21 00:56:35
男子爬上泰山“五岳独尊”石刻拍照,景区:将核查其身份进行处理

男子爬上泰山“五岳独尊”石刻拍照,景区:将核查其身份进行处理

扬子晚报
2026-04-17 12:09:40
天空:斯洛特有望下赛季继续执教,迪奥曼德是其首要引援目标

天空:斯洛特有望下赛季继续执教,迪奥曼德是其首要引援目标

懂球帝
2026-04-21 21:31:13
早日康复,海港球迷挂出巨型横幅祝福鼓励受伤的加布里埃尔

早日康复,海港球迷挂出巨型横幅祝福鼓励受伤的加布里埃尔

懂球帝
2026-04-21 20:27:17
八千里路云和月:七哥下线,孟万福成田先生助手,玉娇协助曾雪飞

八千里路云和月:七哥下线,孟万福成田先生助手,玉娇协助曾雪飞

小七追剧站
2026-04-21 18:36:28
兵败如山倒!国产新能源或已证明:中国压根不需要二线豪华品牌

兵败如山倒!国产新能源或已证明:中国压根不需要二线豪华品牌

青烟小先生
2026-04-21 09:44:04
红外相机立大功!2026年秦岭惊现“鼬科之狼”,曾猎杀大熊猫致死

红外相机立大功!2026年秦岭惊现“鼬科之狼”,曾猎杀大熊猫致死

万象硬核本尊
2026-04-21 19:26:51
2026-04-21 22:35:00
我是一个养虾人
我是一个养虾人
有态度网友ytd
1586文章数 11关注度
往期回顾 全部

科技要闻

创造4万亿帝国、访华20次,库克留下了什么

头条要闻

媒体:急于摆脱对华稀土依赖 美企28亿美元在巴西抢矿

头条要闻

媒体:急于摆脱对华稀土依赖 美企28亿美元在巴西抢矿

体育要闻

62岁,成为中国足坛最火的人

娱乐要闻

周润发时隔16年再卖楼,变现数亿资产

财经要闻

现实是最大的荒诞:千亿平台的冲突始末

汽车要闻

全新坦克700正式上市 售价42.8万-50.8万元

态度原创

艺术
旅游
游戏
公开课
军事航空

艺术要闻

任伯年写竹,真带劲

旅游要闻

江苏吴江带着文旅“定胜卡”亮相上海豫园

玩家怒喷《黑旗》重制实机不如原版!育碧拉完了?

公开课

李玫瑾:为什么性格比能力更重要?

军事要闻

特朗普公开对伊开战真正原因

无障碍浏览 进入关怀版