首頁 >資料庫 >mysql教程 >為什麼具有公共子表達式假脫機的視窗聚合函數會導致如此高的邏輯讀取?

為什麼具有公共子表達式假脫機的視窗聚合函數會導致如此高的邏輯讀取?

Patricia Arquette
Patricia Arquette原創
2024-12-29 21:52:10314瀏覽

Why Do Windowed Aggregate Functions with Common Subexpression Spools Result in Such High Logical Reads?

為什麼具有公共子表達式假脫機的視窗聚合函數的邏輯讀取如此高?

您已經注意到,在具有公共子表達式的執行計劃中spools 中,報告的大表邏輯讀取明顯高於預期。調查揭示了一個似乎成立的公式:工作表邏輯讀取= 1 NumberOfRows 2 NumberOfGroups 4.

理解公式

高邏輯讀取源自工作表處理讀取的獨特方式。此上下文中的邏輯讀取指的是讀取的行數,而不是散列頁數。這意味著對於處理的每一行,工作表都會註冊一次邏輯讀取。

邏輯讀取細分

  • 1:初始值讀取以處理第一行。
  • NumberOfRows * 2:在輔助線軸的兩次通過期間,每行被讀取兩次。
  • NumberOfGroups * 4:主線軸每組發出四行:一行用於啟動群組,一個用於結束群組,兩個用於保存聚合值。

複製嘗試使用較低的邏輯讀取

您嘗試使用堆表複製程序僅顯示11 次邏輯讀取,因為:

  • 更少的行:您的與較大的#Orders 相比,測試表只有 5行表。
  • 無巢狀循環:您的查詢使用 OUTER APPLY 而不是巢狀循環,這消除了對虛擬行的需求。

結論

你發現的公式成立,因為它準確地反映了工作表讀取的行。更高的邏輯讀取是由於基於行的計數方法,而不是效率低。原始查詢中使用的巢狀循環計劃進一步放大了此計數。

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

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