Mysql sql 语句调试

一. 执行报错内容不是真实的报错内容

5c7a1d65d1c5e45a63bd1137342ec5d5f52.jpg

存储过程和关联的存储过程都不存在'value_1_'这个字段

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

bf5242a7c6375f9183cdea9bcd7a3e88808.jpg

反馈出真实的报错原因

由于customer_po_no_ 变量设置了长度2000  ,游标循环叠加的customer_po_no_ 的时候超出了长度 ,在循环内添加

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

即可;

二. 没有报错但获取的游标没有全部执行完直接退出,提示执行成功

明明获取了游标,但就是只执行了几个,代码表面上看不出问题

7ef7737f2f2f24d020460f3476baf9e1042.jpg

全部执行大概要一个小时,结果只执行了几秒,检查数据,发现只执行了前面几个;

这个时候,可以通过每执行一次,就更新或者插入数据到一张表里面,观察那张表的规律,看下执行到哪个位置游标就直接跳出整个循环

如:

77c971652c4da3d7a483b7c72f953600d00.jpg

再尝试单独执行断开那个数据,观察有没有报错或者那个数据有什么特殊的

这个时由于 ****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;

四. 对于千万级别的数据,抽取数据的语句一定要使用索引

b1a65452787121a4e2a258e6724bdbd96c9.jpg

7f1f6ac4f4354c5b21073e1f3aeb5d7b00a.jpg

虽然即使使用没有索引的也是在一秒之内,但对于复杂运作,数据量大的存储过程,的时候,本来一个小时可以完成执行,结果10多个小时也执行不下,误以为是死循环;

由于有索引的表是分开归档和没有归档,虽然获取数据要分开两次,还要条件判断执行,但整体效率比直接用没有中间表快很多

转载于:https://my.oschina.net/u/3556610/blog/1838700

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值