首頁 >資料庫 >mysql教程 >為什麼使用視窗聚合函數時邏輯讀取如此高,尤其是使用公共子表達式假脫機時?

為什麼使用視窗聚合函數時邏輯讀取如此高,尤其是使用公共子表達式假脫機時?

Linda Hamilton
Linda Hamilton原創
2024-12-26 18:47:15894瀏覽

Why are logical reads so high when using windowed aggregate functions, especially with common subexpression spools?

為什麼視窗聚合函數的邏輯讀取如此之高?

視窗聚合函數可能會導致執行計畫中報告的高邏輯讀取子表達式假脫機,特別是對於大型表。本文旨在解釋這項觀察背後的原因,並為理解工作表的邏輯讀取計數提供見解。

說明

與傳統方法相比,工作表的邏輯讀取計數不同線軸表。在工作表中,讀取的每一行都會轉換為一次「邏輯讀取」。這與「真實」假脫機表的雜湊頁報告不同。

以這種方式計數讀取的基本原理是,它為分析提供了更有意義的資訊。由於這些結構的內部性質,追蹤工作表的雜湊頁不太有用。假脫機報告行更能反映了 tempdb 資源的實際使用率。

公式推導

預測工作表邏輯讀取的推導公式為:

Worktable logical reads = 1 + (NumberOfRows * 2) + (NumberOfGroups * 4)

這個公式考慮了以下:

  • 1: 表示將資料初始載入到工作表中。
  • NumberOfRows * 2: 兩個輔助線軸 (建立用於減少返回行的成本)被完全讀取兩次。
  • NumberOfGroups * 4: 主線軸如下所述發出行,從而得出不同組別值的計數(加 1)。

主線軸行發射

主線軸,已指派任務累積行並執行聚合計算,操作如下:

  • 從輸入中讀取每一行並將其寫入工作表。
  • 當遇到新群組時,它發出巢狀循環運算子的一行,指示新群組分區的開始。
  • 每組的平均值是使用工作表。
  • 平均值與工作表中的行連接。
  • 工作表被截斷以準備下一組。
  • 為了處理最後一組,線軸發出虛擬行。

附加註意事項

在您的測試腳本中,您注意到複製相同的進程會導致邏輯讀取減少 (11)。這種差異歸因於查詢處理器在不同環境中採用的最佳化演算法。在使用嵌套循環或哈希連接的一般情況下,該公式仍然有效。

結論

了解工作表中邏輯讀取的計數差異對於準確解釋涉及視窗聚合函數的執行計劃至關重要。提供的公式提供了一種有用的方法來估計工作表邏輯讀取,有助於效能分析和最佳化工作。

以上是為什麼使用視窗聚合函數時邏輯讀取如此高,尤其是使用公共子表達式假脫機時?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn