zoukankan      html  css  js  c++  java
  • sql优化实战:从1353秒到135秒(删除索引+修改数据+重建索引)

    最近在优化日结存储过程,日结存储过程中大概包含了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秒。

    总结:

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

  • 相关阅读:
    安卓系统浏览器中select下拉按钮无法弹出选择面板奇怪问题解决
    Webkit浏览器点击控件时出现的边框消除
    UML序列图总结
    UML序列图总结
    UML类图几种关系的总结
    UML类图几种关系的总结
    UML用例图总结
    UML用例图总结
    类与类之间的关系
    java核心技术----Object类
  • 原文地址:https://www.cnblogs.com/firstdream/p/7892306.html
Copyright © 2011-2022 走看看