SQL Server 2005資料頁讀取--高階掃描

iSQlServer發表於2010-03-26
 

在 SQL Server Enterprise Edition 中,高階掃描功能使得多項任務可以共享完全表掃描。如果 Transact-SQL 語句的執行計劃需要掃描表中的資料頁,並且資料庫引擎檢測到其他執行計劃正在掃描該表,則資料庫引擎會在第二個掃描的當前位置將第二個掃描加入第一個掃 描。資料庫引擎會一次讀取一頁,並將每一頁的行傳遞給這兩個執行計劃。此操作將一直持續到該表的結尾處。

此時,第一個執行計劃已有完整的掃描結果,而第二個執行計劃仍必須檢索在它加入正在進行的掃描之前讀取的資料頁。然後,第二個執行計劃中的掃描將繞 回到表的第一個資料頁,並從這裡向前掃描到它加入第一個掃描時所處的位置。可以按這種方式組合任意數量的掃描。資料庫引擎將迴圈遍歷資料頁,直到完成所有 掃描。這種機制也稱為“走馬燈式掃描”,說明了為何在沒有 ORDER BY 子句的情況下無法保證 SELECT 語句所返回結果的順序。

例如,假設某個表有 500,000 頁。UserA 執行了一條 Transact-SQL 語句,要求對該表進行掃描。當掃描已處理了 100,000 頁時,UserB 執行了另一條 Transact-SQL 語句,要對同一個表進行掃描。資料庫引擎將為頁 100,001 之後的頁安排一組讀取請求,並將每頁中的行同時傳遞迴兩個掃描。當掃描到頁 200,000 時,UserC 執行了另一條 Transact-SQL 語句,要對同一個表進行掃描。則從頁 200,001 開始,資料庫引擎將把它讀取的每一頁中的行傳遞迴所有三個掃描。當資料庫引擎讀取完第 500,000 行之後,UserA 的掃描就完成了,而 UserB 和 UserC 的掃描將繞回到頁 1 開始讀取。當資料庫引擎到達頁 100,000 時,UserB 的掃描就完成了。然後 UserC 的掃描將繼續進行,直到它讀取完頁 200,00。此時,所有掃描便均已完成。

在沒有高階掃描的情況下,每個使用者都必須要爭用緩衝區空間並因此導致磁碟臂爭用。然後,會分別為每個使用者讀取一次相同的頁,而不是一次讀取並由多個 使用者共享,這樣會降低效能並加重資源負擔。

在 SQL Server Enterprise Edition 中,高階掃描功能使得多項任務可以共享完全表掃描。如果 Transact-SQL 語句的執行計劃需要掃描表中的資料頁,並且資料庫引擎檢測到其他執行計劃正在掃描該表,則資料庫引擎會在第二個掃描的當前位置將第二個掃描加入第一個掃 描。資料庫引擎會一次讀取一頁,並將每一頁的行傳遞給這兩個執行計劃。此操作將一直持續到該表的結尾處。

此時,第一個執行計劃已有完整的掃描結果,而第二個執行計劃仍必須檢索在它加入正在進行的掃描之前讀取的資料頁。然後,第二個執行計劃中的掃描將繞 回到表的第一個資料頁,並從這裡向前掃描到它加入第一個掃描時所處的位置。可以按這種方式組合任意數量的掃描。資料庫引擎將迴圈遍歷資料頁,直到完成所有 掃描。這種機制也稱為“走馬燈式掃描”,說明了為何在沒有 ORDER BY 子句的情況下無法保證 SELECT 語句所返回結果的順序。

例如,假設某個表有 500,000 頁。UserA 執行了一條 Transact-SQL 語句,要求對該表進行掃描。當掃描已處理了 100,000 頁時,UserB 執行了另一條 Transact-SQL 語句,要對同一個表進行掃描。資料庫引擎將為頁 100,001 之後的頁安排一組讀取請求,並將每頁中的行同時傳遞迴兩個掃描。當掃描到頁 200,000 時,UserC 執行了另一條 Transact-SQL 語句,要對同一個表進行掃描。則從頁 200,001 開始,資料庫引擎將把它讀取的每一頁中的行傳遞迴所有三個掃描。當資料庫引擎讀取完第 500,000 行之後,UserA 的掃描就完成了,而 UserB 和 UserC 的掃描將繞回到頁 1 開始讀取。當資料庫引擎到達頁 100,000 時,UserB 的掃描就完成了。然後 UserC 的掃描將繼續進行,直到它讀取完頁 200,00。此時,所有掃描便均已完成。

在沒有高階掃描的情況下,每個使用者都必須要爭用緩衝區空間並因此導致磁碟臂爭用。然後,會分別為每個使用者讀取一次相同的頁,而不是一次讀取並由多個 使用者共享,這樣會降低效能並加重資源負擔。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-630487/,如需轉載,請註明出處,否則將追究法律責任。

相關文章