-
sql语句大全之一个业务场景的优化讨论
碰到这样一个业务场景:每个用户订单会有好几个合同文件,其中某些合同文件需要盖章,盖章是有专门的盖章服务完成的,盖章完成后,文件会有一个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上建一个索引即可了。
各位大神有什么好的其它方案么?
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式