某客户反馈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连接条件使索引失效相关推荐

  1. mysql表disable_[MySQL优化案例]系列 -- DISABLE/ENABLE KEYS的作用

    [MySQL优化案例]系列 -- DISABLE/ENABLE KEYS的作用 作/译者:叶金荣 来源:http://imysql.cn 转载请注明作/译者和出处,并且不能用于商业用途,违者必究. 有 ...

  2. [MySQL优化案例]系列 — slave延迟很大优化方法

    备注:插图来自网络搜索,如果觉得不当还请及时告知 :) 一般而言,slave相对master延迟较大,其根本原因就是slave上的复制线程没办法真正做到并发.简单说,在master上是并发模式(以In ...

  3. mysql分页案例_MySQL优化案例系列-mysql分页优化

    通常,我们会采用ORDER BY LIMIT start, offset 的方式来进行分页查询.例如下面这个SQL: SELECT * FROM `t1` WHERE ftype=1 ORDER BY ...

  4. [MySQL优化案例]系列 -- OPTIMIZE的威力

    作/译者:叶金荣(Email: ),来源:http://imysql.cn,转载请注明作/译者和出处,并且不能用于商业用途,违者必究. 1.先来看看多次删除插入操作后的表索引情况 mysql> ...

  5. [MySQL优化案例]系列 — 典型性索引引发CPU负载飙升问题

    收到一个mysql服务器负载告警,上去一看,load average都飙到280多了,用top一看,CPU跑到了336%,不过IO和内存的负载并不高,根据经验,应该又是一起索引引起的惨案了. 看下pr ...

  6. [MySQL优化案例]系列 -- 试用TCMalloc

    作/译者:叶金荣(Email: ),来源:http://imysql.cn,转载请注明作/译者和出处,并且不能用于商业用途,违者必究. TCMalloc 是用于优化C++写的多线程应用,比glibc ...

  7. mysql 优化 案例_[MySQL优化案例]系列 -- OPTIMIZE的威力

    作/译者:叶金荣(Email: ),来源:http://imysql.cn,转载请注明作/译者和出处,并且不能用于商业用途,违者必究. 1.先来看看多次删除插入操作后的表索引情况 mysql> ...

  8. [MySQL优化案例]系列 -- 用TIMESTAMP类型取代INT和DATETIME

    引言:在以前,我总是习惯用 INT UNSIGNED 来存储一个转换成Unix时间戳的时间值,认为这样做从索引,比较等角度来讲,都会比较高效.现在我们来对比下 TIMESTAMP 和 INT UNSI ...

  9. [MySQL优化案例]系列 -- DISABLE/ENABLE KEYS的作用

    作/译者:叶金荣(Email: ),来源:http://imysql.cn,转载请注明作/译者和出处,并且不能用于商业用途,违者必究. 有一个表 tbl1 的结构如下: CREATE TABLE `t ...

最新文章

  1. 完美的隐藏软键盘方法
  2. HTTPS协议,SSL协议及完整交互过程
  3. RabbitMQ的安装(linux篇)
  4. 使用脚本创建查找修改销毁游戏对象
  5. 敏捷开发的45个好习惯
  6. Java8 PriorityBlockingQueue源码分析
  7. jdk 9和jdk8_JDK 9是某些功能的终结
  8. excel快速填充_F4键,Excel中最强大的快捷键,没有之一
  9. kettle清洗mysql数据_ETL工具Kettle使用以及与Java整合实现数据清洗
  10. 蓝牙条码扫描枪如何选购
  11. 中兴iptv机顶盒破解教程图文:亲测中兴B760EV3、B860A、B860AV1.1完美安装应用!非ttl破解![转]
  12. 迈克尔·霍利:当我看到人们急着加入新行列、抛弃高度发展的老技术时,我就感到很伤心
  13. [ACMMM2018]BeautyGAN: Instance-level Facial Makeup Transfer with DeepGenerative Adversarial Network
  14. 上海公积金网上提取_为什么提取上海公积金租房这么简单?
  15. python做一个本地搜索工具_SecretFinder:一款基于Python脚本的JavaScript敏感信息搜索工具...
  16. win7搜索文件 服务器,win7系统搜索不到文件的解决方法
  17. srv.exe蠕虫病毒~
  18. 【C#】如何给变量取一个好的名字
  19. C++ OpenCV特征提取之KAZE检测
  20. java怎么给pr 上字幕_如何给Final Cut Pro快速加字幕(PR也适用)

热门文章

  1. 城市售票网提前获取token,在最后3秒卡进去的一点心得
  2. 阿里云、腾讯云、百度云、京东云、华为云、盛大云、ucloud优势分析
  3. 阿里云、腾讯云、百度云、京东云、华为云、盛大云、ucloud他们都有哪些优点?
  4. 有关windows黑屏的解决办法
  5. 关于python的lambda函数、以下选项错误的是_小猿圈python之python期末考试测试题(一)...
  6. ERP SD Billing问题
  7. Git Bash 窗口下无法复制粘贴的问题解决
  8. 穿透版CTP综合交易平台接口V2.0-程序化交易编程模板(VC源码)
  9. SC01B液位传感器
  10. 关于 html5 使用 Canvas画圆的问题