事務日誌:小事務與大事務以提高速度
我正在嘗試了解事務日誌的工作原理,並且已經研究了幾天。
當完成盡可能多的小事務時,一些操作會變得更快,例如小批量刪除許多行。請參閱在沒有子句的情況下加速巨大的 DELETE FROM <table> 的方法
當一個大的顯式事務圍繞游標包裝時,其他操作(例如游標)會變得更快。這對我來說似乎很矛盾……
有人可以解釋一下嗎?
使用額外資訊進行編輯。我的表是帶有聚集索引和 NC 索引的行儲存,用於刪除中的謂詞。
如果您使用的是最新版本的 SQL Server,您可以比較小批量中每個 sys.dm_exec_session_wait_stats 的會話等待與一個刪除比較。啟用查詢儲存並比較小批量刪除和單次刪除之間的邏輯讀取、物理讀取和 CPU 時間等指標也很有指導意義。
如果沒有額外的細節,對你的問題的更徹底的回答需要大量的猜測,它不會太有用。例如,所述問題未指定表行儲存或列儲存是否已分區,表是否具有主鍵或聚集索引(如果它是行儲存表),刪除如何分成小批量,或者如何將尺寸選擇為“小”(它只是猜測還是經過測試的眾多候選者之一?)。
Aaron Bertrand 在下面的部落格文章中仔細考慮了其中的許多因素——在某些情況下,儲存子系統的特性可以使單個刪除比許多小刪除更快,即使他似乎也感到驚訝。
刪除 SQL Server 2019 中大量記錄的最快方法 12 月 3 日 https://www.mssqltips.com/sqlservertip/6238/fastest-way-to-delete-large-number-of-records-in-sql-server/
這是一個可能的場景,可以解釋您所看到的性能差異 - 但也有許多其他可能的場景。
事務日誌很可能已經足夠大,它不需要增長來記錄執行小批量刪除的單個會話的許多小的、不重疊的事務。同時,單個大刪除很可能需要事務日誌多次增長以適應記錄其活動。事務日誌不允許利用即時文件初始化 - 如果事務日誌自動增長,它必須在寫入完成之前寫入整個新的增長區域。出於這個原因,許多支持單個大型事務的小型事務日誌自動增長可能會加劇寫入日誌等待並大大增加單個大型刪除的持續時間。