Wednesday, August 19, 2015

[MYSQL] 多層式子查詢 效能注意事項

table1
id | no
-------
1 | 001
2 | 002
3 | 003

table2
id | no | user | yn
-------------------
1 | 002 | aaa | y
2 | 002 | bbb | y
3 | 002 | ccc | n
4 | 002 | bbb | y

案例說明:
table1 是單據主檔, table2 是單據的簽核記錄,假設 002 這張單據需要 aaa, bbb, ccc 三個人都同意(y),只要其中一個人不同意(n),就要重簽,所以 002 這張單目前簽核同意的人只有 bbb 一個人,我們要怎麼用一個 sql 語法抓出來呢?很簡單...

SELECT t1.no, t2.user
FROM table1 AS t1 INNER JOIN table2 AS t2 ON t1.no = t2.no
WHERE t1.no = '002' AND t2.id > (
  SELECT MAX(id)
  FROM table2
  WHERE no = t1.no AND yn = 'n'
)

這樣寫看起來沒什麼問題
但在多層式子查詢結構的狀態下,強烈建議改成以下語法
SELECT t1.no, t2.user
FROM table1 AS t1 INNER JOIN table2 AS t2 ON t1.no = t2.no
WHERE t1.no = '002' AND t2.id > (
  SELECT MAX(id)
  FROM table2
  WHERE no = t2.no AND yn = 'n'
)
差異點在於子查詢的 where 條件 前者是 no = t1.no 後者是 no = t2.no,基本判斷邏輯就是,讓子查詢 where 範圍越小越好,因為 t1.no 是指所有的單據,而 t2.no 已經被限縮到 002 這張單據,以我在工作上實際遇到的 case ,這兩種語法速度可以差到上百倍之多。

No comments:

Post a Comment