Varchar(max)的Write方式与stuff的比较

对于字符串的操作,一般使用的都是stuff方法,但是对于varchar(max)类型的列来说,在2005以后,还增加了另外一种方法:WRITE ( expression, @Offset , @Length )。对于wirte函数的使用,见联机文档。一般来说,1)、Writestuff的作用相类似,但是稍有区别。2)、write的效率能高一些。以下是一些说明与测试。

--建立测试表

if object_id('tempdb..#1') is not null

   drop table tempdb..#1

go

CREATE TABLE tempdb..#1 (

     [id] [bigint] IDENTITY(1,1) NOT NULL,

     [dtcol] [datetime] NULL,

     [charcol] [varchar](100) COLLATE Chinese_PRC_CI_AS NULL,

     [maxcol] [varchar](max) COLLATE Chinese_PRC_CI_AS NULL,

 CONSTRAINT [pk_id] PRIMARY KEY CLUSTERED

(

     [id] ASC

)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]

) ON [PRIMARY]

 

Go

--向测设表中插入10W条数据

declare @i int @dt datetime

select @i=0,@dt='1900-1-1'

while @i<100000

begin

   insert into tempdb..#1 (dtcol,charcol,maxcol)

   values(@dt+@i,replicate(char(rand()*26+65),100),replicate(newid(),100))

   set @i=@i+1

end

一、区别:

1)、Stuff函数:函数为stuff(maxcol,30,4,'abcd'),那么是从第三十位开始进行替换,即第30位也同样在替换的范围内。

2)、Write方法:函数为maxcol.write('abcd',30,4),那么是从第31为开始进行替换。

3)、write方法只能用在update中,而stuff函数可以使用在select中。

二、功能相同

Varchar(max)的Write方式与stuff的比较_第1张图片

 

效率测试

/*一下语句每次测试的时候都要执行*/

--清空缓存

Checkpoint                         

dbcc freeproccache

dbcc dropcleanbuffers

go

--查看时间

set statistics time on

go

declare @t datetime

set @t=getdate()

--测试时stuff运行一次,相应的write也执行一次

update #1                                

set maxcol=stuff(maxcol,31,4,'abcd')

select datediff(ss,@t,getdate())

 Varchar(max)的Write方式与stuff的比较_第2张图片

 

结论:从整体情况来看,write的效率比stuff还是能高一些,主要体现

1)、在对max列的字符的开头和末尾,效率能高一点。原因:当执行stuff的时候,会加载整个字符串,而write不会加载整个字符串。

2)、如果对字符串内部的字符串进行操作的话,效率基本相同,见第一条测试情况。虽然从datediff的时间来看,write的时间比较少,但是总体实际运行时间是基本上相同的,因为write的方法出了执行,还需要进行编译

3)、对于write方法,语句的执行时间占总的实际运行时间的一半,因为使用write方法需要进行编译,然后执行。Datediff显示的是执行时间,实际运行时间-datediff的时间就是对sql编译的时间。

 

你可能感兴趣的:(object,测试,null,table,insert,statistics)