成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

為什么事務日志自動增長會降低你的性能

開發 后端 前端
在這篇文章里,我想詳細談下為什么你要避免事務日志(Transaction Log)上的自動增長操作(Auto Growth operations)。很多運行的數據庫服務器,對于事務日志,用的都是默認的日志文件大小和自動增長設置。人們有時會很依賴自動增長機制,因為它們剛 好能正常工作。

在這篇文章里,我想詳細談下為什么你要避免事務日志(Transaction Log)上的自動增長操作(Auto Growth operations)。很多運行的數據庫服務器,對于事務日志,用的都是默認的日志文件大小和自動增長設置。人們有時會很依賴自動增長機制,因為它們剛 好能正常工作。當然,如果它正常工作的話,你不必太關注它,但很快你會發現會有問題出現。

只依賴于事務日志的自動增長機制總不是個好主意。首先它會導致嚴重的日志碎片(Log Fragmentation),在SQL Server啟動期間,在你數據庫上執行崩潰恢復(Crash Recovery)時會有很大的負面影響。另外,在你數據庫里寫入事務需要等待,只要事務日志觸發了自動增長機制。

當事務日志的自動增長機制發生時,SQL Server總要零初始化新塊,這個會在文件末尾加上。這和你的SQL Server實例是否用即時文件初始化(Instant File Initialization)特權——事務日志總會零初始化。這上面的原因非常明顯:當SQL Server在過去已經完成事務日志的環繞式處理(wrap-around ),崩潰恢復(Crash Recovery)需要知道在哪里停。

零初始化的問題是會占用更多的時間(取決與你的自動增長率,還有你的存儲速度)。在此期間沒有別的事務可以寫事務日志記錄到事務日志。在事務日志管 理器上會有閂鎖造成的阻塞。因此你的寫入事務會進入掛起狀態(直到它們獲得需要的閂鎖),它們就等啊,等啊,等啊,直到你的事務日志自動增長完成。讓我們 用一個簡單的例子演示下。

首先我為這個演示創建一個新的數據庫。對于這個數據庫,這里我不用默認的設置,對于事務日志,我指定了10GB的自動增長系數。這個的確是個不好的做法,但我只是用它來展示這個設置的副作用。請不要在你的生產數據庫里使用這個錯誤配置!??!

  1. -- Create a new database with 10 GB Auto Growth for the Transaction Log 
  2. CREATE DATABASE AutoGrowthTransactionLog ON PRIMARY 
  3.     NAME = N'AutoGrowthTransactionLog'
  4.     FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\AutoGrowthTransactionLog.mdf'
  5.     SIZE = 5120KB, 
  6.     FILEGROWTH = 1024KB 
  7. LOG ON 
  8.     NAME = N'AutoGrowthTransactionLog_log'
  9.     FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\AutoGrowthTransactionLog_log.ldf'
  10.     SIZE = 1024KB, 
  11.     FILEGROWTH = 10240000KB -- 10 GB Auto Growth! 
  12. GO 

下一步里我在數據庫里創建2個表。第1個表我通過插入一些日志來快速填充我的事務日志。在事務日志自動增長階段,我們在第2個表里插入新的記錄來證明這個事務會被自動增長機制阻塞。

 

  1. -- Create a new table, every records needs a page of 8kb 
  2. CREATE TABLE Chunk 
  3.     Col1 INT IDENTITY PRIMARY KEY, 
  4.     Col2 CHAR(8000
  5. GO 
  6.  
  7. -- Another simple table 
  8. CREATE TABLE Foo 
  9. (    
  10.     Bar INT NOT NULL 
  11. GO 

現在我們已經創建了必須的數據庫對象,因次我可以通過新的沒有立即提交的事務來填充事務日志:

  1. -- Begin a new transaction, that blocks the 1st VLF in the Transaction Log 
  2. BEGIN TRANSACTION 
  3. INSERT INTO Chunk VALUES (REPLICATE('x'8000)) 
  4. GO 

因為我們現在有了進行中,沒提交的事務,SQL Server不能重用那部分事務日志,即這個事務存儲的事務日志。它們有需要回滾的可能。因此現在我通過不同的會話插入66條其他記錄來填充事務日志:

INSERT INTO AutoGrowthTransactionLog.dbo.Chunk VALUES (REPLICATE('x', 8000))
GO 66

***在***個會話里提交我們的事務:

COMMIT

這意味著在我們面前有一個幾乎滿的的事務日志,我們可以通過DBCC LOGINFO來驗證:

DBCC LOGINFO

現在當我們往表里插入兮的記錄時,事務日志已經沒有可用空間了,SQL Server進入事務日志的自動增長。

  1. -- This statement will trigger the Auto Growth mechanism! 
  2. INSERT INTO Chunk VALUES (REPLICATE('x'8000)) 
  3. GO 

在自動增長期間的同時,為了監控發生了什么,我們可以在SSMS里打開新的一個會話窗口,嘗試在第2個表插入另外的記錄——表Foo

-- This statement is now blocked by the Auto Growth mechanism.
INSERT INTO Foo VALUES (1)
GO

這個SQL 語句會阻塞,因為事務要寫入事務日志記錄的事務日志,當前不可用。為了進一步分析這個阻塞情形,你可以打開第3個會話窗口,執行下列2個SQL語句:

 

  1. -- Analyze the blocking situation 
  2. SELECT wait_type, * FROM sys.dm_exec_requests 
  3. WHERE session_id IN (5455
  4.  
  5. SELECT wait_type, * FROM sys.dm_os_waiting_tasks 
  6. WHERE session_id IN (5455
  7. GO 

(額,俺本機測試失敗………………)

從代碼里可以看到,我用2個DMV sys.dm_exec_requests 和 sys.dm_os_waiting_tasks對2個會話都進行了跟蹤——觸發自動增長的會話,和被自動增長機制阻塞的會話。在這里,觸發自動增長的會 話里有所謂的搶占等待類型(Preemptive Wait Type)——PREEMPTIVE_OS_WRITEFILEGATHER。搶占等待類型是由SQL Server返回的等待類型,當SQL Server 執行一個WIN32 API函數在調度機制之外時。這里自動增長是通過WriteFileGather的WIN32 API函數完成的。

INSERT語句嘗試在Foo表里插入新的記錄出現LATCH_EX等待類型。如你從DMV sys.dm_os_waiting_tasks 里的resource_description列所見,在SQL Server的日志管理器上需要獲得閂鎖。你可以通過查詢DMV sys.dm_os_latch_stats 限制lactch class為LOG_MANAGER再次確認。在那個特定閂鎖上你會看到一些等待。那個閂鎖是事務獲取的,由事務日志的自動增長觸發,只要這個閂鎖要獲 得,每個其他寫事務都會被阻塞。因此在系統上有大量等待時間時,這暗示這在事務日志里當前有自動增長問題需要處理。

希望我已經用這個日志說服你,依賴于事務日志的自動增長機制并不是***的解決方案。用這個簡單的例子可以看到,在你數據庫里每個被自動增長操作阻塞的寫入事務會發生阻塞,這肯定會傷及你數據庫的吞吐量和擴展性。為了保證你有很好的事務日志性能,你可以***想實踐下這個文章

責任編輯:王雪燕 來源: Woodytu的博客
相關推薦

2022-09-20 22:27:08

事務失效public 修飾

2016-08-19 01:59:22

APPAPM用戶

2022-04-13 20:53:15

Spring事務管理

2020-06-10 14:10:53

服務開發 架構

2021-08-08 08:17:45

事件響應日志網絡安全

2014-12-23 09:25:56

程序性能代碼

2011-05-27 09:19:32

Windows 7崩潰

2021-11-17 22:41:41

手機電池低溫

2021-03-23 10:08:02

編程互聯網數據科學

2021-11-05 07:18:15

分布式事務業務

2023-09-20 14:54:17

MySQL

2023-12-08 08:18:41

代號UnicodeUTF-8

2016-05-26 10:57:51

2017-11-29 18:16:15

高并發ERP態牛

2022-12-26 09:15:13

2023-02-03 17:25:31

自動化代碼審查開發

2016-03-25 09:17:14

VR虛擬現實

2023-08-17 14:12:17

2025-04-02 04:33:00

CPU服務器時鐘頻率

2024-08-30 16:14:58

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 农村妇女毛片精品久久久 | 欧美成人a∨高清免费观看 欧美日韩中 | 欧美日韩亚洲一区 | 国产精品久久久久久久久久软件 | www日本在线观看 | 亚洲人成人一区二区在线观看 | 欧洲精品在线观看 | 午夜精品一区二区三区在线观看 | 国产午夜精品福利 | 色888www视频在线观看 | 久久精品亚洲欧美日韩精品中文字幕 | 国产精品久久久久久一区二区三区 | 国产一级毛片视频 | 亚洲狠狠 | 成人影院在线视频 | 午夜影院视频在线观看 | 伊人欧美视频 | 国产操操操 | 精品久久九九 | 国产精品一区二区欧美 | 国产精品欧美一区喷水 | 婷婷中文在线 | 日韩久久精品电影 | 成人高清在线视频 | 一级做a爰片性色毛片16 | 草草草草视频 | а_天堂中文最新版地址 | 一级毛片免费看 | 精品区一区二区 | 日本色婷婷 | 国产视频福利一区 | 成人亚洲综合 | 日韩精品欧美精品 | 玖操| 日本久久久久久 | 日一区二区 | 亚洲视频在线播放 | 中文字幕久久久 | 成年人网站在线观看视频 | 久久成人免费 | 国产精品久久久久久亚洲调教 |