MSSQL优化案例系列-在Where子句使用or连接条件使索引失效
某客户反馈ERP经常卡死,线上商城也会经常卡住,使用脚本看了一下正在执行的脚本,定位到了一个会员积分扣减的存储过程,大概长这个样子
CREATE PROCEDURE Sp_CRM_MembersDeductionIntegral
@CardCode varchar(40), --会员卡号
@MobilPhone nvarchar(20), --手机号码
@SourceType int, --扣减类型枚举 0:ERP,1:线上商城
@Integral decimal(24,6) --扣减的积分
AS
BEGIN
declare @CardID varchar(40)
--判断扣减类型,如果是ERP扣减,根据卡号找到会员卡进行扣减,如果是线上商城,传入的是手机号码,根据手机号码找到会员卡扣减
select top 1 @CardID=a.CardID
from Crm_Bas_Card a
join Crm_Bas_CardCustomer b on a.CustomerID=b.CustomerID
where (@SourceType=0 and CardCode=@CardCode)
or (@SourceType=1 and b.MobilPhone=@MobilPhone)
--找到会员卡后继续进行业务逻辑处理
.......
END
GO
进一步观察,发现获取会员卡ID这段代码执行效率很低,整个过程经常要卡1到2分钟的样子,这段代码就要执行1到2分钟。
继续检查索引和数据量,会员卡表数据量200万左右,会员ID,卡号字段上均有索引,会员资料表也是200万左右,会员ID,会员手机号也有索引。
分析这段代码,典型的程序员脚本风格,join索引表,然后引入所有条件来查数据,条件不确定的时候,就使用or来处理,然后因为在条件内使用了or,导致会员卡表的卡号索引和会员资料表的手机号索引均已失效。
改进:把or的逻辑,拆分成if判断分支
if @SourceType=0 --如果来源是ERP,直接从会员卡表找卡ID
select top 1 @CardID=CardID from Crm_Bas_Card where CardCode=@CardCode
if @SourceType=1 --如果来源是线上商城,根据会员手机号找卡ID
select top 1 @CardID=a.CardID
from Crm_Bas_Card a
join Crm_Bas_CardCustomer b on a.CustomerID=b.CustomerID
where b.MobilPhone=@MobilPhone
提交后的过程,后面再去调用,执行时间从2分钟优化到了秒级,再也不会卡住业务操作了。
MSSQL优化案例系列-在Where子句使用or连接条件使索引失效相关推荐
- mysql表disable_[MySQL优化案例]系列 -- DISABLE/ENABLE KEYS的作用
[MySQL优化案例]系列 -- DISABLE/ENABLE KEYS的作用 作/译者:叶金荣 来源:http://imysql.cn 转载请注明作/译者和出处,并且不能用于商业用途,违者必究. 有 ...
- [MySQL优化案例]系列 — slave延迟很大优化方法
备注:插图来自网络搜索,如果觉得不当还请及时告知 :) 一般而言,slave相对master延迟较大,其根本原因就是slave上的复制线程没办法真正做到并发.简单说,在master上是并发模式(以In ...
- mysql分页案例_MySQL优化案例系列-mysql分页优化
通常,我们会采用ORDER BY LIMIT start, offset 的方式来进行分页查询.例如下面这个SQL: SELECT * FROM `t1` WHERE ftype=1 ORDER BY ...
- [MySQL优化案例]系列 -- OPTIMIZE的威力
作/译者:叶金荣(Email: ),来源:http://imysql.cn,转载请注明作/译者和出处,并且不能用于商业用途,违者必究. 1.先来看看多次删除插入操作后的表索引情况 mysql> ...
- [MySQL优化案例]系列 — 典型性索引引发CPU负载飙升问题
收到一个mysql服务器负载告警,上去一看,load average都飙到280多了,用top一看,CPU跑到了336%,不过IO和内存的负载并不高,根据经验,应该又是一起索引引起的惨案了. 看下pr ...
- [MySQL优化案例]系列 -- 试用TCMalloc
作/译者:叶金荣(Email: ),来源:http://imysql.cn,转载请注明作/译者和出处,并且不能用于商业用途,违者必究. TCMalloc 是用于优化C++写的多线程应用,比glibc ...
- mysql 优化 案例_[MySQL优化案例]系列 -- OPTIMIZE的威力
作/译者:叶金荣(Email: ),来源:http://imysql.cn,转载请注明作/译者和出处,并且不能用于商业用途,违者必究. 1.先来看看多次删除插入操作后的表索引情况 mysql> ...
- [MySQL优化案例]系列 -- 用TIMESTAMP类型取代INT和DATETIME
引言:在以前,我总是习惯用 INT UNSIGNED 来存储一个转换成Unix时间戳的时间值,认为这样做从索引,比较等角度来讲,都会比较高效.现在我们来对比下 TIMESTAMP 和 INT UNSI ...
- [MySQL优化案例]系列 -- DISABLE/ENABLE KEYS的作用
作/译者:叶金荣(Email: ),来源:http://imysql.cn,转载请注明作/译者和出处,并且不能用于商业用途,违者必究. 有一个表 tbl1 的结构如下: CREATE TABLE `t ...
最新文章
- 完美的隐藏软键盘方法
- HTTPS协议,SSL协议及完整交互过程
- RabbitMQ的安装(linux篇)
- 使用脚本创建查找修改销毁游戏对象
- 敏捷开发的45个好习惯
- Java8 PriorityBlockingQueue源码分析
- jdk 9和jdk8_JDK 9是某些功能的终结
- excel快速填充_F4键,Excel中最强大的快捷键,没有之一
- kettle清洗mysql数据_ETL工具Kettle使用以及与Java整合实现数据清洗
- 蓝牙条码扫描枪如何选购
- 中兴iptv机顶盒破解教程图文:亲测中兴B760EV3、B860A、B860AV1.1完美安装应用!非ttl破解![转]
- 迈克尔·霍利:当我看到人们急着加入新行列、抛弃高度发展的老技术时,我就感到很伤心
- [ACMMM2018]BeautyGAN: Instance-level Facial Makeup Transfer with DeepGenerative Adversarial Network
- 上海公积金网上提取_为什么提取上海公积金租房这么简单?
- python做一个本地搜索工具_SecretFinder:一款基于Python脚本的JavaScript敏感信息搜索工具...
- win7搜索文件 服务器,win7系统搜索不到文件的解决方法
- srv.exe蠕虫病毒~
- 【C#】如何给变量取一个好的名字
- C++ OpenCV特征提取之KAZE检测
- java怎么给pr 上字幕_如何给Final Cut Pro快速加字幕(PR也适用)
热门文章
- 城市售票网提前获取token,在最后3秒卡进去的一点心得
- 阿里云、腾讯云、百度云、京东云、华为云、盛大云、ucloud优势分析
- 阿里云、腾讯云、百度云、京东云、华为云、盛大云、ucloud他们都有哪些优点?
- 有关windows黑屏的解决办法
- 关于python的lambda函数、以下选项错误的是_小猿圈python之python期末考试测试题(一)...
- ERP SD Billing问题
- Git Bash 窗口下无法复制粘贴的问题解决
- 穿透版CTP综合交易平台接口V2.0-程序化交易编程模板(VC源码)
- SC01B液位传感器
- 关于 html5 使用 Canvas画圆的问题