為什麼視窗聚合函數的邏輯讀取如此之高?
視窗聚合函數可能會導致執行計畫中報告的高邏輯讀取子表達式假脫機,特別是對於大型表。本文旨在解釋這項觀察背後的原因,並為理解工作表的邏輯讀取計數提供見解。
說明
與傳統方法相比,工作表的邏輯讀取計數不同線軸表。在工作表中,讀取的每一行都會轉換為一次「邏輯讀取」。這與「真實」假脫機表的雜湊頁報告不同。
以這種方式計數讀取的基本原理是,它為分析提供了更有意義的資訊。由於這些結構的內部性質,追蹤工作表的雜湊頁不太有用。假脫機報告行更能反映了 tempdb 資源的實際使用率。
公式推導
預測工作表邏輯讀取的推導公式為:
Worktable logical reads = 1 + (NumberOfRows * 2) + (NumberOfGroups * 4)
這個公式考慮了以下:
主線軸行發射
主線軸,已指派任務累積行並執行聚合計算,操作如下:
附加註意事項
在您的測試腳本中,您注意到複製相同的進程會導致邏輯讀取減少 (11)。這種差異歸因於查詢處理器在不同環境中採用的最佳化演算法。在使用嵌套循環或哈希連接的一般情況下,該公式仍然有效。
結論
了解工作表中邏輯讀取的計數差異對於準確解釋涉及視窗聚合函數的執行計劃至關重要。提供的公式提供了一種有用的方法來估計工作表邏輯讀取,有助於效能分析和最佳化工作。
以上是為什麼使用視窗聚合函數時邏輯讀取如此高,尤其是使用公共子表達式假脫機時?的詳細內容。更多資訊請關注PHP中文網其他相關文章!