我这两天被一个问题缠住了,是关于四表连接的问题。我写了一个存储过程,本来就四张表,我用上了存储过程,一定有我(老板)觉得应该用存储过程的原因。
这里的业务是这样的:四张表分表为A B C D,其中B为A的复制表,D为C的复制表,复制表与原始表的差别只是多加了一个字段。而我做的业务更加简单,就是在一定的条件下,将原始表的数据传给复制表,然后再删除原始表中已经被传递的数据。四张表就这么操作,然后就没了。但是!就这么一个简单的功能,我的存储过程居然跑出了两百多秒的战绩。
我一开始怀疑的是数据量的问题,因为数据量太大,在’复制‘的操作中也是很容易存储过程跑不动,卡死的。但是我的四张表,两张复制表清空,两张原始表加起来的数据才不到4万条,还达不到因为数据量太大卡死我的存储过程的时候吧。于是,我排除了这个错误。
第二个,经过分析,我又怀疑是索引的问题,全文检索导致的查询缓慢,进程卡死,但是我那看起来平平无奇的语句,不像会这么搞事情的呀!代码不方便贴出来,给大家举个例子:
insert into A select H.P.....
就这一句语句,能有啥问题嘛!
于是,我直接跳过这个可疑点。
第三个,我怀疑是不是锁表的问题,于是我又开始通过查询锁表的语句来判断自己的原始表是不是被锁了,资源同时占用,果然!表没被锁~我也白多疑了。
最后一个,就是我经常怀疑但不常出现的怀疑点,是不是我这数据库管理软件有问题啊...DBeaver,这家伙常常搞延迟,常常别的管理工具都查到了,但这家伙的脑回路还在遛弯!于是我尝试着结合系统CURD去查别的数据量较大的表的数据,看看查询是否有误,很正常啊~它虽然有时不靠谱,但起码此时是正常的。于是我又排除了这个错误。
于是,我开始最笨也是最有效的方法,逐句排查。果然被我发现了端倪。我的原始表中每个表基本是40多个字段,而我每次插入都是不带列插入,直接一次性全部插入,这就导致了插入非常缓慢,数据库需要自己帮我检索,我目前插入的值是对应原始表的哪个列,我不给它,它就自己找,所以造成了我就干等到两百多秒。所以 请把你的每一行列写清楚!
真的涨了见识,这也让我在日后的语句更加”谨言慎行“!像这个问题,我觉得不需要优化,只需要你根据业务填字段,细心再细心。
如果大家有遇到类似的疑惑,可以参考一下。这是我的‘解题思路’。
提前祝大家’国庆快乐‘,还有十三天班就放假啦!
致力于解决数据库类的bug,有公众号可共享:会用数据库 (欢迎大家关注哦)