[SQL SERVER][Memo]頁面分割影響交易記錄檔大小

[SQL SERVER][Memo]頁面分割影響交易記錄檔大小

前言

我們都知道頁面分割(page splits)是相當耗費系統資源的(會造成額外的I/O讀取和空間浪費),

所以我們應該儘可能減少頁面分割(page splits)產生頻率,

由於之前我一直相當在意查詢效能,直到幾天前才發現,

頁面分割也是會造成昂貴的交易記錄檔大小成本,

下面就來實際測試並紀錄一下。

--drop table test1 
create table test1
(
c1 int,
c2 char(1000)
)
--預設順序 asc
create clustered index cidx_1
on test1(c1)

 
--遺漏 3
insert into test1 
values (1,'rico'),(2,'rico'),(4,'rico'),(5,'rico'),(6,'rico'),(7,'rico'),(8,'rico')

 
--依造順序新增資料
begin tran
insert into test1 values(9,'rico') 

 
--查看系統交易所使用的位元組數
select database_transaction_log_bytes_used as '代表交易之系統交易所使用的位元組數'
from sys.dm_tran_database_transactions
where database_id = 14

 

image

 

恢復上個交易後再次新增資料並製造頁面分割


--製造頁面分割
begin tran
insert into test1 values(3,'rico') 

--查看系統交易所使用的位元組數
select database_transaction_log_bytes_used as '代表交易之系統交易所使用的位元組數'
from sys.dm_tran_database_transactions
where database_id = 14

 

image

1 page=8kb(maximum row  size=8060 bytes),當我新增 c1=3 資料時因為SQL Server要維護資料表順序,

所以這時交易就會連帶產生頁面分割動作(也超過大小限制),而你也可以看該交易使用的位元組數是之前約2.4倍,

當你交易中包含未經排序資料時,不僅會產生額外的交易記錄檔,

而交易記錄檔過大也將會影響備份、Mirror、log shipping..等相關效能。

 

 

參考

How expensive are page splits in terms of transaction log?

sys.dm_tran_database_transactions (Transact-SQL)

[SQL SERVER][Memo]再談 Clustered Index

[SQL SERVER][Performance]小心使用With NoLock