調校遇上使用到 UNION ALL 語法,調校前 (使用 5 次) 後 (使用 3 次) 都沒有因為 UNION ALL 關係導致讀出全部資料來操作
改善後語法
SELECT .................. FROM ( SELECT .................. FROM psendoutheader WHERE .................. UNION ALL SELECT .................. FROM psendoutheader AS R JOIN ( SELECT .................. FROM customer ) AS w1 ON r.custno = w1.custno AND (r.date BETWEEN w1.daybgn AND w1.dayend) WHERE .................. ) AS T JOIN VWCUSTOMER AS c1 ON T.CustNO = c1.CustNO JOIN ( SELECT .................. FROM psendout AS t UNION ALL SELECT .................. FROM psendback AS t UNION ALL SELECT .................. FROM psendstock AS t ) AS p ON T.out_id = p.out_id JOIN pobasic AS F ON P.odno = F.odno從下面執行計畫部分截圖,就可以發現啦,是利用 Nested Loops 一筆一筆進 UNION ALL 內的每一個 Table 內把資料找出來,最後再 UNION ALL 後傳出
然後很無聊的把第 25 行的 JOIN 改為 LEFT JOIN,想說會不會因此就讀出全部資料 UNION ALL 後才會去進行比對,執行計劃也沒有變化,^^''
自己的迷思自己來打破,還是要觀察執行計劃才會知道 TSQL 是如何執行的
沒有留言:
張貼留言