SQL 語法我已經要調快一週了,因為資料量很大,所以要在 DAO 層直接寫 SQL 在資料庫查詢同時直接聚合出結果,我也不知道為什麼我可以搞這麼久,確實我從沒寫過這麼複雜的 SQL,但就是怎麼改都過不了 Review,快瘋了。
但我好像一直都沒靜下心來好好想該怎麼寫最好,一直叫 ai 生成後測試,看結果如何,跑一下執行計畫看看有沒有吃到索引之類的,Join 東 Join 西的好煩啊,有時沒寫 Join 但其實 SQL 執行計畫會用 Join 來跑,所以還是要小心。
第一次認識 CTE,基本上它不就是臨時表的概念嗎?好像沒啥特別,就等於是用個子查詢,然後把結果用變數存起來這樣,後面還能複用,不過它幫我不少忙,寫到一個 summary 的聚合時,因為用了兩個 CTE 的結果都是一行,所以用 from 表1, 表2 時原本應該會變成 cross join,但 CTE 幫我避開了笛卡爾乘積。
Left Join 會產生很多空欄位,要避免。最好是先用 CTE 處理過,再去 Left Join 兩張表,可以減少不必要的空欄。
COALESCE 如果值是 Null 就給預設。
ROUND 設小數點後幾位。
之類的。
執行計畫可以看到資料庫實際上是怎麼跑語法的策略,有時候會跟預想不同,跟資料量大小也有關,資料太小就直接掃全表了,不會用索引優化等等的。