Mysql sql 語句調試

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

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

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

反饋出真實的報錯原因

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

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

即可;

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

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

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

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

如:

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

這個時由於 ****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多個小時也執行不下,誤以爲是死循環;

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章