随笔 - 74  文章 - 0  评论 - 94  阅读 - 12万

一个业务场景的优化讨论

碰到这样一个业务场景:每个用户订单会有好几个合同文件,其中某些合同文件需要盖章,盖章是有专门的盖章服务完成的,盖章完成后,文件会有一个ID与之匹配。

关于这样一个业务,研发的同学建了如下这样一张表:

CREATE TABLE [dbo].[UserFile](
    [Id] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
    ....
    [NeedStamp] [bit] NULL,
    [SealApplyId] [int] NULL
)

往里面塞数据的时候,需要盖章的文件:

INSERT INTO [dbo].[UserFile](...,NeedStamp,SealApplyId)VALUES(...,1,NULL)

不需要盖章的文件:

INSERT INTO [dbo].[UserFile](...,NeedStamp,SealApplyId)VALUES(...,0,NULL)

然后定期抽取需要盖章的文件送去盖章服务:

SELECT * FROM [dbo].[UserFile] WHERE NeedStamp = 1 AND SealApplyId IS NULL

盖好章之后呢:

UPDATE [dbo].[UserFile] SET SealApplyId = @SealApplyId WHERE ID=@ID

这样的业务跑一段时间之后发现抽取需要盖章的数据查询非常缓慢:

原因是符合NeedStamp = 1需要盖章的数据非常多,符合SealApplyId IS NULL条件的数据也非常多,虽然符合组合条件NeedStamp = 1 AND SealApplyId IS NULL的数据非常稀少。

这样即算我以NeedStamp和SealApplyId组合创建索引,查询都不会用到索引。(无论哪个字段放在前面统计信息都不会理想)

这样的情况下我的解决方案有两种:

1、简单粗暴的利用hint强制走索引:

SELECT * FROM [dbo].[UserFile] WITH(INDIX(idx_SealApplyId_NeedStamp)) WHERE NeedStamp = 1 AND SealApplyId IS NULL

2、重新定义SealApplyId的初始值(或者分表):

需要盖章的文件SealApplyId初始值定义为0、不需要盖章的文件SealApplyId定义为-1(甚至可以直接分表把不需要盖章的文件放到别的表)。

由于需要盖章且未盖章的数据即SealApplyId=0的数据会非常少,这样直接在SealApplyId上建一个索引即可了。

各位大神有什么好的其它方案么?

posted on   万剑齐发  阅读(370)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示