您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > varchar(n),nvarchar(n)长度、性能、及所占空间实验分析
varchar(n),nvarchar(n)长度、性能、及所占空间实验分析varchar(n),nvarchar(n)长度、性能、及所占空间分析,其中说到n不会影响到数据库空间大小及性能,甚至n是max也可能影响不到,占用空间好说,有官方文档,自己测一下也能看出,但是否影响性能,只道听途说,拿不出论据来,今天我来拿个例子证明一下以上说法,如有不妥之处,敬请拍砖------------------------------------------------------------------------------------Subject:nvarchar(n)及nvarchar(max)中的n及max是否会影响性能--Author:柳永法(yongfa365)--CreateDate:2010-11-2223:31:04--Environment:MicrosoftSQLServer2008R2(RTM)-(IntelX86)--Apr2201015:53:02--Copyright(c)MicrosoftCorporation--EnterpriseEvaluationEditiononWindowsNT5.2X86(Build3790:ServicePack2)------------------------------------------------------------------------------------首先创建两个表,一个放nvarchar(4000),一个放nvarchar(max)CREATETABLE[dbo].[testnvarchar4000](idintIDENTITY(1,1),cntnvarchar(4000))GOCREATETABLE[dbo].[testnvarcharmax](idintIDENTITY(1,1),cntnvarchar(max))GO--然后插入10万条数据,每个cnt里放4000个字符(nvarchar(n)里n的最大值),大约1.6GBEGINTRANSACTIONDECLARE@iINT;SET@i=0;while@i100000begininsertinto[testnvarchar4000]values(LEFT(REPLICATE(cast(@iasnvarchar)+'我是柳永法',1000),4000))insertinto[testnvarcharmax]values(LEFT(REPLICATE(cast(@iasnvarchar)+'我是柳永法',1000),4000))set@i=@i+1ENDCOMMIT--清空缓存,或重启SQL服务,测试查询速度及lob读取情况(lob是大对象的意思)--测试testnvarcharmaxDBCCDROPCLEANBUFFERSDBCCFREEPROCCACHESETSTATISTICSIOONSETSTATISTICSTIMEONSELECTCOUNT(*)FROMtestnvarcharmaxWHEREcntLIKE'%柳永法%'SETSTATISTICSTIMEOFFSETSTATISTICSIOOFF--测试testnvarchar4000DBCCDROPCLEANBUFFERSDBCCFREEPROCCACHESETSTATISTICSIOONSETSTATISTICSTIMEONSELECTCOUNT(*)FROMtestnvarchar4000WHEREcntLIKE'%柳永法%'SETSTATISTICSTIMEOFFSETSTATISTICSIOOFF--结果:--(1行受影响)--表'testnvarcharmax'。扫描计数3,逻辑读取100000次,物理读取8494次,预读99908次,lob逻辑读取0次,lob物理读取0次,lob预读0次。----SQLServer执行时间:--CPU时间=1172毫秒,占用时间=30461毫秒。--(1行受影响)--表'testnvarchar4000'。扫描计数3,逻辑读取100000次,物理读取8523次,预读99916次,lob逻辑读取0次,lob物理读取0次,lob预读0次。----SQLServer执行时间:--CPU时间=968毫秒,占用时间=30038毫秒。--从结果可以看出,这两次读取时间基本相同,并且都没有lob读取,以上数据为多次测试结果。--给testnvarcharmax前1000条字段长度+1,来测试是不是超过4000字就会使用lob读取UPDATEtestnvarcharmaxSETcnt=cnt+'1'WHEREid=1000--结果:--(1行受影响)--表'testnvarcharmax'。扫描计数3,逻辑读取100000次,物理读取8292次,预读99696次,lob逻辑读取900次,lob物理读取83次,lob预读0次。----SQLServer执行时间:--CPU时间=1124毫秒,占用时间=30318毫秒。--此结果显示使用了lob读取。但时间相差也不太大。--字段值加倍,再测试:UPDATEtestnvarcharmaxSETcnt=cnt+cntWHEREid=1000--结果:--(1行受影响)--表'testnvarcharmax'。扫描计数3,逻辑读取100000次,物理读取8164次,预读99521次,lob逻辑读取1000次,lob物理读取101次,lob预读0次。----SQLServer执行时间:--CPU时间=1094毫秒,占用时间=31095毫秒。复制代码从以上结果基本上可以证明自己文章头提到的观点,nvarchar(n)或nvarchar(max)中的n及max只是一个符号,不会影响占用空间及性能,除非max存储字符数大于4000,所以我们只要关注实际业务需要就可以了,本文由陕西亿捷智能家居(/html/?435.html)站长Dancer原创编辑,转载请注明出处,小生将不胜感激
本文标题:varchar(n),nvarchar(n)长度、性能、及所占空间实验分析
链接地址:https://www.777doc.com/doc-8761704 .html