Sql-Server

如何解決執行緩慢的子查詢 TSQL

  • July 3, 2014

我遇到了執行緩慢的查詢的問題。

我已經使用 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 並查看邏輯讀取和執行計劃,它可能能夠幫助您縮小瓶頸並建議您是否/在哪裡需要指數。

引用自:https://dba.stackexchange.com/questions/68659