帮同事优化一个迭代SQL,相同SQL结果集不同

SELECT 

  deptCode,

  deptCName,

  upperDeptCode 

FROM

  (SELECT 

    * 

  FROM

    sc_pubcompany 

  WHERE upperDeptCode > 0 

  ORDER BY upperDeptCode,

    deptCode) realname_sorted,

  (SELECT 

    @pv := '2000000000') initialisation 

WHERE (

    FIND_IN_SET(upperDeptCode, @pv) > 0 

    AND @pv := CONCAT(@pv, ',', deptCode)

  ) 

  AND validFlag = '1' 

ORDER BY deptCode;

 

这个执行,每次结果不同:

 

 

 

 

排查原因:

首先排查数据来源问题:

(SELECT

*

FROM

sc_pubcompany

WHERE upperDeptCode > 0

ORDER BY upperDeptCode,

deptCode) realname_sorted

 

我把这部分的结果,单独拉出来查询,结果每次结构相同。

当时一下子就排除了数据来源的原因。

卡了很久。

 

 

之后,我将这部分数据,单独拉倒了一个临时表:

create table temp like sc_pubcompany;

 

insert into temp

SELECT

*

FROM

sc_pubcompany

WHERE upperDeptCode > 0

ORDER BY upperDeptCode,

deptCode;

 

SELECT 

  deptCode,

  deptCName,

  upperDeptCode 

FROM

temp,

  (SELECT 

    @pv := '2000000000') initialisation 

WHERE (

    FIND_IN_SET(upperDeptCode, @pv) > 0 

    AND @pv := CONCAT(@pv, ',', deptCode)

  ) 

  AND validFlag = '1' 

ORDER BY deptCode;

 

结果发现:

1、 每次结果稳定了;

2、 数据多了至少三倍;

 

由此推测: 导致之前数据不稳定的原因,可能是 子查询 占用的是内存,

而后续变量及其迭代也在大量占用内存,导致内存不够用,

结果变少的同时, 结果集也不稳定。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值