临时表与表变量的深入探究(2)
来源:未知 责任编辑:责任编辑 发表时间:2015-09-17 09:42 点击:次
if OBJECT_ID('tempdb..#T') is not null drop table #T
www.2cto.com
declare @b1 bigint, @b2 bigint
CREATE TABLE #T (s char(128))
SELECT @b1=num_of_bytes_written from sys.dm_io_virtual_file_stats(2, 2)
declare @i int = 0
while @i<20000
BEGIN
insert into #T select '临时表:原值'
set @i=@i+1
END
use tempdb
checkpoint
select @b2=num_of_bytes_written from sys.dm_io_virtual_file_stats(2, 2)
select @b2-@b1 as 日志增量
--经测试,临时表日志增量 4851712
www.2cto.com
然后是表变量插入
use TestDB
declare @b1 bigint, @b2 bigint
declare @V table (s char(128))
select @b1=num_of_bytes_written from sys.dm_io_virtual_file_stats(2, 2)
declare @i int = 0
while @i<20000
begin
insert into @V select '表变量:原值'
set @i=@i+1
end
use tempdb
checkpoint
select @b2=num_of_bytes_written from sys.dm_io_virtual_file_stats(2, 2)
select @b2-@b1 as 日志增量
--经测试,表变量日志增量5007360
www.2cto.com
两者日志记录相差不多,表变量还比临时表的日志写入更多!
3)Lock上的不同表现
--临时表
if OBJECT_ID('tempdb..#T') is not null drop table #T
create table #T (s varchar(128))
insert into #T select '临时表:原值'
execute sp_lock @@spid --查看当前用户进程的会话 所在的锁关系
BEGIN TRANSACTION
update #T set s= '临时表:被更新'
execute sp_lock @@spid --发现增加了一个排他锁
ROLLBACK TRANSACTION
execute sp_lock @@spid --排他锁被释放
www.2cto.com
GO
--表变量
declare @V table (s char(128))
insert into @V select '表变量:原值'
execute sp_lock @@spid
BEGIN TRANSACTION
update @V set s='表变量:被更新'
execute sp_lock @@spid
ROLLBACK TRANSACTION
execute sp_lock @@spid --并没有在事务中加任何锁
临时表的更新会加锁,表变量更新不会
4)事务处理中的不同
if OBJECT_ID('tempdb..#T') is not null drop table #T
create table #T (s varchar(128))
declare @T table (s varchar(128))
相关新闻>>
最新推荐更多>>>
- 发表评论
-
- 最新评论 更多>>