sql優化實戰:從1353秒到135秒(刪除索引+修改資料+重建索引)

weixin_34391854發表於2017-11-24

最近在優化日結儲存過程,日結儲存過程中大概包含了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秒。

總結:

這個快的原因是批量化操作,不是每次修改一條資料就去修改索引,而是刪除索引,這樣修改資料也不會涉及到索引,然後批量修改資料,之後重建索引也是一個批量化的操作,所以速度才快的。

相關文章