码迷,mamicode.com
首页 > 数据库 > 详细

sql优化实战:从1353秒到135秒(删除索引+修改数据+重建索引)

时间:2017-11-24 22:49:17      阅读:170      评论:0      收藏:0      [点我收藏+]

标签:tail   mod   删除   sqlserver   int   多个   tle   cte   detail   

最近在优化日结存储过程,日结存储过程中大概包含了20多个存储过程。

发现其有一个存储过程代码有问题,进一步发现结存的数据中有一个 日期字段business_date 是有问题的,这个字段对应的类型是varchar,但是存储过程传入参数的类型是char,导致最后结存进去的数据末尾多了几个空格。

比如,应该是‘2016-12‘的,但现在是‘2016-12  ‘。

 

为了解决这个问题,要修改这个字段的值,去掉尾部的空格,于是运行如下语句:

 

  1. update TB_CUSTOMER_FROZEN  
  2. set BUSINESS_DATE = rtrim(BUSINESS_DATE)  
update TB_CUSTOMER_FROZEN
set BUSINESS_DATE = rtrim(BUSINESS_DATE)

运行结果:

 

(10483163 row(s) affected)

数据量1000w左右,运行时间22分33秒,也就是1253秒,真的是太慢了。。。

 

这么慢肯定是有原因的。

于是看了一下原来表中有2个索引,一个聚集索引(business_date字段),一个非聚集索引(也包含了business_date字段),相当于每次修改数据的同时也要修改索引值,这才是慢的原因。

想想,可以先删除索引,然后更新数据,在重建索引,最后总耗时:6秒+1分29秒+60秒 = 135秒。

总结:

这个快的原因是批量化操作,不是每次修改一条数据就去修改索引,而是删除索引,这样修改数据也不会涉及到索引,然后批量修改数据,之后重建索引也是一个批量化的操作,所以速度才快的。

sql优化实战:从1353秒到135秒(删除索引+修改数据+重建索引)

标签:tail   mod   删除   sqlserver   int   多个   tle   cte   detail   

原文地址:http://www.cnblogs.com/firstdream/p/7892306.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!