帮同事优化一个迭代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;

 

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

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

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

 

 

 

 

排查原因:

首先排查数据来源问题:

(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、 数据多了至少三倍;

 

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

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

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