Sql-Server

多個事務日誌文件和性能影響

  • August 2, 2018

因此,我與幾個人就給定數據庫應具有的事務日誌文件的數量進行了爭論。我看過幾篇文章說每個數據庫應該只有一個事務日誌文件,但在任何 Microsoft 白皮書中都沒有。然而,在許多情況下,我發現增加給定數據庫的事務日誌文件的數量實際上會提高數據庫的寫入性能。我應該注意到,所有這些數據庫都處於完全恢復模式,並且為 I/O 子系統使用了一個大型 SAN 框架。如果許多文章都說事務寫入全部連續發生在一個文件中,直到到達文件末尾,那麼寫入將繼續到後續的日誌文件,為什麼增加日誌文件的數量最終會對磁碟的寫入速度產生非常顯著的改善?在最近的案例中,通過將日誌文件的數量從 1 個增加到 8 個,我們看到 IO 從 700 Kb/s 躍升至超過 60 Mb/s。任何輸入都將不勝感激。

事務日誌寫入是順序的。任何時候都只會寫入其中一個日誌文件,因此擁有多個文件(就其本身而言)不可能更改該數據庫的 I/O 模式。

除非你走運。例如,您已將第二個日誌文件添加到 SSD 或其他速度更快或更不繁忙的磁碟,或者將日誌文件拆分到多個磁碟並針對多個數據庫執行此操作,並且您現在觀察到更好的 I/O,因為日誌已切換到更快磁碟上的該文件,或者與您的其他數據/日誌文件更加隔離。換句話說,我相信任何觀察到的 I/O 差異完全是由於其他因素造成的,這只是巧合,而不是因為您單獨添加了日誌文件。SQL Server 被明確設計為一次只使用一個日誌文件 - 那麼多個日誌文件如何可能提高日誌寫入性能,除非目前日誌文件位於更快/更隔離的磁碟上?我認為您需要提供更好的經驗證據(這樣做您可能會自己發現性能提高的真正原因)。

請完整閱讀這些文章——它們是由一個在 SQL Server 儲存團隊工作了一段時間的聰明人寫的,所以我不認為他在編造這些東西是為了好玩:

Kimberly Tripp 在一篇有價值的文章中也談到了這一點:

請注意,這 8 個步驟中沒有一個涉及添加事務日誌文件。事實上,她建議不要這樣做。

擁有多個日誌文件還有其他危險,特別是如果它們很大(想想 RTO) - 確實沒有什麼可收穫的。

事務日誌文件以順序方式寫入和使用。這可以通過DBCC LOGINFO檢查日誌文件中虛擬日誌文件 (VLF) 的使用來觀察。例如,如果我有一個數據庫和一個表,我在其中插入 1000 行,DBCC LOGINFO將提供以下內容:

RecoveryUnitId FileId      FileSize             StartOffset          FSeqNo      Status      Parity CreateLSN
-------------- ----------- -------------------- -------------------- ----------- ----------- ------ ---------------------------------------
0              2           3866624              8192                 32          2           64     0
0              2           3866624              3874816              33          2           64     0
0              2           3866624              7741440              34          2           64     0
0              2           4120576              11608064             0           0           0      0

需要注意的重要列是:

  • FSeqNo - 這是 VLF 使用的順序
  • 狀態- VLF 的目前狀態。2 表示啟動,0 表示準備好重複使用

引擎一次只能使用一個 VLF,並且會按順序使用可用的 VLF,直到到達文件末尾。一旦這樣做,它將嘗試返回文件中第一個可用的 VLF。如果一個不可用,則日誌文件將增長。

對於多個文件,此順序保持不變。在使用完前面文件中的所有 VLF 之前,不能使用第二個(或第三個或第四個)中的 VLF。例如,這是DBCC LOGINFO來自具有兩個日誌文件的數據庫:

RecoveryUnitId FileId      FileSize             StartOffset          FSeqNo      Status      Parity CreateLSN
-------------- ----------- -------------------- -------------------- ----------- ----------- ------ ---------------------------------------
0              2           3866624              8192                 32          0           64     0
0              2           3866624              3874816              33          0           64     0
0              2           3866624              7741440              34          0           64     0
0              2           4120576              11608064             35          0           64     0
0              3           3866624              8192                 36          2           64     0
0              3           3866624              3874816              37          2           64     0
0              3           3866624              7741440              38          2           64     0
0              3           4120576              11608064             39          2           64     0

您可以將 FSeqNo 和 Status 列與 FileId(與您在 中找到的 FileID 相同sys.database_files)關聯起來。請注意 FSeqNo 跨越並維護文件的順序。

這就是為什麼多個日誌文件對您沒有幫助的原因。多個數據文件的原因是您可以將 IO 流分發到這些文件,但您無法從日誌文件中獲得這樣的好處,因為對它所做的一切都是以循環、順序的方式進行的。

引用自:https://dba.stackexchange.com/questions/62344