Sql-Server
如何解決執行緩慢的子查詢 TSQL
我遇到了執行緩慢的查詢的問題。
我已經使用 sql server profiler 分析了查詢,但似乎找不到一個好的解決方案。
我確實找到了為什麼它執行緩慢。如果詢問完整數據集,它會在 10 秒內返回 150 行,如果我添加總和和計算,它會返回 18 行,但需要 8 分鐘。
在 SQL Server Profiler 中,我發現完整的數據集進行了大約 1 000 000 次讀取,而總和查詢大約為 82 000 000。但我不知道他如何或為什麼會獲得一些記錄。因為完整數據集是總和查詢的子選擇。
下面的查詢是一個範例,不是真正的查詢(真正的查詢在子查詢中也有 union all,但 sum 查詢基本相同)
SELECT Sum(x) * 0.1, Sum(y), a FROM (SELECT x, y FROM tx INNER JOIN ty ON tx.a = ty.a WHERE x = 1 --this returns 150 rows in 10s ) sub GROUP BY a -- sum returns 18row 8min
有人可以幫我做一些我必須做的測試或可以測試的解決方案嗎?
看起來您在最右側有幾個聚集索引掃描,它們佔據了大部分查詢成本。
您將不得不提供有關這些的更多詳細資訊(我正在努力閱讀它),基本上,我們需要檢查我們是否不能在其上放置更好的索引。
此外,如果您使用的是 SQL Server 2012 或 2014,以及 Enterprise 或 Dev 版本,請嘗試將非聚集列儲存索引放在聚合列上。
在我看來,您不需要派生表。有什麼理由你不能這樣寫:
SELECT Sum(x) * 0.1, Sum(y), a FROM tx INNER JOIN ty ON tx.a = ty.a WHERE x = 1 GROUP BY a
這可能不會解決您所有的性能問題,但如果您設置統計 IO 並查看邏輯讀取和執行計劃,它可能能夠幫助您縮小瓶頸並建議您是否/在哪裡需要指數。