1. 程式人生 > >幫同事優化一個迭代SQL,相同SQL結果集不同

幫同事優化一個迭代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、 資料多了至少三倍;

由此推測: 導致之前資料不穩定的原因,可能是 子查詢 佔用的是記憶體,

而後續變數及其迭代也在大量佔用記憶體,導致記憶體不夠用,

結果變少的同時, 結果集也不穩定。