在大型記憶體電腦上觸發緩衝集區掃描的作業可能會執行緩慢

本文說明掃描 SQL Server 緩衝集區可能需要很長的時間來完成大型記憶體電腦上的掃描。

適用于:  SQL Server
原始 KB 編號:   4566579

徵狀

Microsoft SQL Server 中的某些作業會觸發緩衝集區的掃描, (在記憶體) 中儲存資料庫頁面的快取。 在具有大量 RAM 的系統上 (1 TB 的記憶體或更大的) ,掃描緩衝集區可能需要很長的時間。 這會減慢觸發掃描的作業。

導致緩衝集區掃描的作業

以下是一些可能會觸發緩衝集區掃描的作業:

  • 資料庫啟動
  • 資料庫關閉或重新開機
  • AG 容錯移轉
  • 資料庫移除 (drop)
  • 從資料庫中移除檔案
  • 完整或差異資料庫備份
  • 資料庫還原
  • 交易記錄還原
  • 線上還原
  • DBCC CHECKDBDBCC CHECKTABLE 運算

錯誤記錄顯示掃描花費了很長的時間

SQL Server 2016 SP3SQL Server 2017 CU23SQL Server 2019 CU9,已將錯誤訊息新增至 SQL Server錯誤記錄檔,以指出緩衝區集掃描掃描時間已花很長的時間 (10 秒或更長) :

緩衝集區掃描耗時14秒:資料庫 ID 7、命令 ' BACKUP DATABASE '、作業 ' FlushCache '、掃描的緩衝區115、總回應緩衝區204640239、等候時間0毫秒。 如需 https://go.microsoft.com/fwlink/?linkid=2132602 詳細資訊,請參閱 ' '。

診斷長時間掃描的擴充事件

此外,從相同的組建開始 SQL Server 2016 SP3SQL Server 2017 CU23SQL Server 2019 CU9已引進 buffer_pool_scan_complete 擴充事件,以協助識別長的緩衝集區掃描。

如果掃描需要超過1秒,當事件已啟用時,XEvent 將會記錄為下列。

name database_id elapsed_time_ms 命令 操作 scanned_buffers total_iterated_buffers
buffer_pool_scan_complete 7 1308 備份資料庫 FlushCache 243 19932814

注意

在 XEvent 中的臨界值較小,可讓您以更精細的細微性來捕獲資訊。

因應措施

目前沒有任何方法可以消除此問題。 如果作業必須快速完成,請先使用下列命令來清除緩衝集區,然後再執行該操作。

  1. CHECKPOINT在每個資料庫上執行

    USE <DatabaseName>
    CHECKPOINT
    GO
    

    如果 SQL Server 主控多個資料庫,請 CHECKPOINT 針對所有使用者資料庫重複此命令。

  2. 在伺服器上的所有資料庫都已執行檢查點後,請使用下列命令縮小緩衝集區的大小:

    DBCC DROPCLEANBUFFERS
    

    警告

    從緩衝集區中刪除清理緩衝區可能會產生很大的影響,但會使效能降級。 這個命令會從記憶體中移除所有未修改的資料庫頁面,這會導致後續的查詢執行從磁片上的資料庫檔案中重新讀取資料。 透過磁片 I/O 存取資料的程式,會導致查詢速度變慢。 不過,一旦頁面再次讀入快取,SQL Server 會繼續從那裡讀取。

  3. 執行會產生緩衝集區掃描的作業,例如完整資料庫備份。

其他資訊

如需大型緩衝集區中可能發生之問題的詳細資訊,請參閱SQL Server:大型 RAM 及 DB 檢查點