Mysql sql 語句調試

一. 執行報錯內容不是真實的報錯內容

存儲過程和關聯的存儲過程都不存在'value_1_'這個字段mysql

可使用navicat的命令窗口執行sql

反饋出真實的報錯緣由oop

因爲customer_po_no_ 變量設置了長度2000  ,遊標循環疊加的customer_po_no_ 的時候超出了長度 ,在循環內添加spa

IF LENGTH(customer_po_no_) >= 1950 THEN
                           LEAVE archive_loop;
end IF;

便可;code

二. 沒有報錯但獲取的遊標沒有所有執行完直接退出,提示執行成功

明明獲取了遊標,但就是隻執行了幾個,代碼表面上看不出問題blog

所有執行大概要一個小時,結果只執行了幾秒,檢查數據,發現只執行了前面幾個;索引

這個時候,能夠經過每執行一次,就更新或者插入數據到一張表裏面,觀察那張表的規律,看下執行到哪一個位置遊標就直接跳出整個循環it

如:class

再嘗試單獨執行斷開那個數據,觀察有沒有報錯或者那個數據有什麼特殊的效率

這個時因爲 ****Diff() 那個存儲過程裏面有一個變量的設置爲 varchar(200), 那個變量會接收GROUP_CONCAT(customer_po_no) 的數據;把修改爲 varchar(20000)便可;

三. GROUP_CONCAT 的長度限制,以及徹底找不到緣由的報錯

1. group_concat 默認長度時1024,

能夠在my.ini 裏面設置須要的長度,重啓mysql 

#group_concat 的長度
group_concat_max_len=102400;

也能夠;

SET GLOBAL group_concat_max_len=102400;
SET SESSION group_concat_max_len=102400;

2. group_concat 是不能夠直接使用limit 限制長度

如:

select GROUP_CONCAT(a) from a_tab limit 5;

獲取的結果也是所有的;

須要套多一個select 在外面纔可使用

select GROUP_CONCAT(a SEPARATOR ',') 
  from (select c.a as a from a_tab c limit 5) t;

3. group_concat 不明緣由提示超長,明明獲取的數據是絕對不會超長的

將獲取的變量強制格式轉換爲char 便可

select GROUP_CONCAT(CAST(a AS char) SEPARATOR ',') 
  from (select c.a as a from a_tab c limit 5) t;

四. 對於千萬級別的數據,抽取數據的語句必定要使用索引

雖然即便使用沒有索引的也是在一秒以內,但對於複雜運做,數據量大的存儲過程,的時候,原本一個小時能夠完成執行,結果10多個小時也執行不下,誤覺得是死循環;

因爲有索引的表是分開歸檔和沒有歸檔,雖然獲取數據要分開兩次,還要條件判斷執行,但總體效率比直接用沒有中間錶快不少

相關文章
相關標籤/搜索