[SQL SERVER][Memo]了解update process
前几天朋友问我执行update statement,SQL SERVER Database Engine是先delete后insert的吗?
在很久以前我可能会直接且绝对回答"Yes",但现在可就不会这么绝对say yes
毕竟数据库博大精深,启可随便蒙混唬烂过关,所以不废话马上来测试实验看看。
这里简单测试两种状况(数据长度大小相同)
1.依照PK更新table数据
2.依照Non-Clustered index更新table数据
建立测试table
CREATE TABLE ##test1(
scn int,
col varchar(20),
CONSTRAINT PK_test1 PRIMARY KEY (scn)
)
go
CREATE TABLE ##test2(
scn int,
col varchar(20),
CONSTRAINT PK_test2 PRIMARY KEY (scn)
)
go
insert data
insert into ##test1 select 1,'111111111'
insert into ##test1 select 2,'222222222'
insert into ##test1 select 3,'333333333'
insert into ##test1 select 4,'444444444'
insert into ##test1 select 5,'555555555'
insert into ##test2 select 1,'111111111'
insert into ##test2 select 2,'222222222'
insert into ##test2 select 3,'333333333'
insert into ##test2 select 4,'444444444'
insert into ##test2 select 5,'555555555'
check object_id
use tempdb
go
select db_id(),object_id from sys.all_objects tt where tt.name in ('##test1','##test2')
go
确认数据保存位置
dbcc extentinfo (2,37575172)
dbcc extentinfo (2,101575400)
查看两个table数据分页保存内容
dbcc traceon(3604)
dbcc page(2,1,110,1)
dbcc page(2,1,115,1)
PAGE: (1:110)
PAGE: (1:115)
两个table数据保存分页内容是相同的。
测试第一种情况:依照PK更新table数据
update ##test1 set scn=6 where scn=1
go
delete from ##test2 where scn=1
insert into ##test2 select 6,'111111111'
go
再度确认两个table数据分页保存内容
PAGE: (1:110)
PAGE: (1:115)
两个table结构一模一样,row0数据都在120~144字节,但原来96~120却没有任何数据
看来情况一符合大家所知道的概念,Database Engine update是先delete后insert。
测试第二种情况:依照Non-Clustered index更新table数据
建立NONCLUSTERED INDEX
CREATE NONCLUSTERED INDEX idx_test1
ON ##test1(col)
go
CREATE NONCLUSTERED INDEX idx_test2
ON ##test2(col)
go
update data
update ##test1 set col='sixsixsix' where scn=6
go
delete from ##test2 where scn=6
insert into ##test2 select 6,'sixsixsix'
go
再度确认两个table数据分页保存内容
PAGE: (1:110)
PAGE: (1:115)
这时可以看到保存内容不同了,##test1保存结构没有变化,但##test2结构却发生变化了
原本216个字节保存row4数据,但现在这笔数据却保存在240字节以后
而原本192~216却没有保存任何数据,这里##test2很明显就形成了内部碎片
所以对该情况来说,Database Engine update并不是一般大家所知的先delete后insert。
当然真实世界情况有很多种,这里我只是简单测试并非就代表全部。
最后祝大家Happy New Year,虎年行大运。
原文:大专栏 [SQL SERVER][Memo]了解update process