[SQL SERVER][Memo]了解update process

[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

image

确认数据保存位置


dbcc extentinfo (2,37575172)
dbcc extentinfo (2,101575400)

image

查看两个table数据分页保存内容


dbcc traceon(3604)
dbcc page(2,1,110,1)
dbcc page(2,1,115,1)

PAGE: (1:110)

image

PAGE: (1:115)

image

两个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

image

再度确认两个table数据分页保存内容

PAGE: (1:110)

image

PAGE: (1:115)

image

两个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

image

再度确认两个table数据分页保存内容

PAGE: (1:110)

image

PAGE: (1:115)

image

这时可以看到保存内容不同了,##test1保存结构没有变化,但##test2结构却发生变化了

原本216个字节保存row4数据,但现在这笔数据却保存在240字节以后

而原本192~216却没有保存任何数据,这里##test2很明显就形成了内部碎片

所以对该情况来说,Database Engine update并不是一般大家所知的先delete后insert。

当然真实世界情况有很多种,这里我只是简单测试并非就代表全部。

最后祝大家Happy New Year,虎年行大运。

原文:大专栏  [SQL SERVER][Memo]了解update process


猜你喜欢

转载自www.cnblogs.com/chinatrump/p/11468274.html
今日推荐