ㄈ# JOIN 貴在每一列都要去另一張表配對
JOIN 不是「把兩張表貼在一起」這種免費操作。它的語意是:左邊每一列,都要在右邊找出對應的列。成本是這個配對動作乘上列數。
為什麼會貴
資料庫大致有三種做法,成本差距很大:
- Nested loop:外表每一列,去內表找一次。內表那一次查找沒有索引 → 每一列都掃一次內表,成本 O(N×M)。
- Hash join:先把一張表整個建成 hash table 放記憶體,再拿另一張表逐列去查。快,但記憶體放不下就要落到磁碟。
- Merge join:兩邊都先排序再對走。排序本身是成本。
所以同一句 JOIN 可能很快也可能爆掉,關鍵在:join 欄位有沒有索引、參與配對的列數有多大(見 WHERE 決定回傳幾列,索引才決定要看過幾列)。
還有列數放大
JOIN 的結果列數不是 max(N, M),而是配對出來的組合數。一對多、多對多會讓中間結果比任何一張原表都大,後面的 ORDER BY、GROUP BY、DISTINCT 都得在那個放大後的集合上做。
判準
- 只是要「順便帶幾個欄位」→ 想想能不能少 join 一張表,或分兩次查再在應用層組。
- 在迴圈裡或每一頁都 join 一次 → 成本被頁數乘一次,跟 同一個寫法在互動式列表沒事,在全量掃描必爆 是同一種陷阱。
- 判斷不了就看執行計畫,別憑直覺。