幫同事優化一個迭代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、 資料多了至少三倍;
由此推測: 導致之前資料不穩定的原因,可能是 子查詢 佔用的是記憶體,
而後續變數及其迭代也在大量佔用記憶體,導致記憶體不夠用,
結果變少的同時, 結果集也不穩定。