前言
當系統在 Query 資料庫時,執行太久時,要如何處理呢?
我們可以建立 Checklist 的問題,來釐清問題所在。
例如以下 檢核表 的例子,
問題 | 使用者回覆 | 可能問題 |
---|---|---|
這個 Query 的目的是什麼? | 將資料輸出到 Excel 後,依年度產生每個地區的銷售數量(包含 銷售人員)。例如,2019 年北美地區銷售訂單狀態為進行中的資料 | Query 是否跟目的相符? |
目前想要解決什麼問題 | 這個查詢太久了,是否可以讓它快一點? | 查看 Query 篩選是否符合 SARG |
Query 是否有取回正確的資料? | 可能有吧~ | Query 篩選條件可能有問題 |
Query 有取回多餘的資料嗎? | 有。在 Excel 中,我要刪除許多欄位,並過濾掉許多資料 | Query 篩選條件有問題,是否 Select 過多的欄位? |
這個 Query 曾經快過嗎? | 有的,在幾個月前,它跑的是快的 | 幾個月前是否更新程式導致變慢 |
找找 Query 問題點
Query 目的為 取得 2019 年北美地區銷售訂單狀態為進行中的資料 來檢視以下的 SQL 有那些要調整的地方,
1 | SELECT * |
… 有找到那些問題呢???
1.so.SalesDate
是 DateTime 類別,所以不用再透過 CONVERT 來轉換 (SARG),這樣會讓 so.SalesDate
無法用到 index
2.要加上 北美地區銷售
及 訂單狀態為進行中
的篩選條件
3.Select *
改成列出需要的欄位
4.使用者會將資料匯出 Excel 再後製,所以是否有必要排序?
所以調整過的 Query 可能會如下,
1 | SELECT so.Col1, So.Col2, ... |
參考資源
針對 SQL Server 上執行緩慢的查詢進行疑難排解
How to use sargable expressions in T-SQL queries; performance advantages and examples