问题描述:
项目组人员反馈在执行一条提取数据SQL时执行很慢,每次执行一段时间就报超时,要求帮忙提取下。
解决过程:
项目组人员发来SQL后,看了下SQL,没什么问题,就在客户端上执行了下,但在执行了一段时间后发现后仍未出结果,然后登陆服务器,查看高消耗SQL,发现排第一的就是该SQL,
然后查看了下该SQL执行计划,执行计划如下:
看到该执行计划立马发现有问题,两表关联产生了笛卡尔积,预估查询20多T,从该执行计划就可以看出肯定是关联条件有问题,再次查看了下要执行的SQL,发现是where条件处表别名引用错误,
select count(1) from xxx.xxxxxp, xxxx.xxxxxc where p.com_id = p.com_id and p.prod_status = '0';
关联条件引用了同一张表别名,这样肯定有问题
然后终止了该SQL,修改了别名条件,再次查询很快就出结果,修改后的SQL执行计划如下:
本次教训就是对于一些项目组发来的查询SQL也一定要观察仔细,特别是最好先要explain查看下该SQL的执行计划再做决定是否需要执行。