网站导航网学 原创论文 原创专题 网站设计 最新系统 原创论文 论文降重 发表论文 论文发表 UI设计定制 论文答辩PPT格式排版 期刊发表 论文专题
返回网学首页
网学原创论文
最新论文 推荐专题 热门论文 论文专题
当前位置: 网学 > 设计资源 > 数据库 > 正文

nvarchar(n)及nvarchar(max)中的n及max是否会影响性能

论文降重修改服务、格式排版等 获取论文 论文降重及排版 论文发表 相关服务

前些天写一文章:varchar(n),nvarchar(n) 长度、性能、及所占空间分析,其中说到n不会影响到数据库空间大小及性能,甚至n是max也可能影响不到,占用空间好说,有官方文档,自己测一下也能看出,但是否影响性能,只道听途说,拿不出论据来,今天我来拿个例子证明一下以上说法,如有不妥之处,敬请拍砖

  1. --首先创建两个表,一个放nvarchar(4000),一个放nvarchar(max) 
  2.  
  3. CREATE TABLE [dbo].[testnvarchar4000] ( 
  4. id int IDENTITY (1, 1) , 
  5. cnt nvarchar(4000) 
  6. )  
  7. GO 
  8. CREATE TABLE [dbo].[testnvarcharmax] ( 
  9. id int IDENTITY (1, 1) , 
  10. cnt nvarchar(max
  11. )  
  12.  
  13. GO 
  14.  
  15. --然后插入10万条数据,每个cnt里放4000个字符(nvarchar(n)里n的最大值),大约1.6G 
  16.  
  17.  
  18. BEGIN TRANSACTION 
  19.     DECLARE @i INT ; 
  20.     SET @i = 0 ; 
  21.     while @i<100000 
  22.     begin 
  23.         insert into [testnvarchar4000] values(LEFT(REPLICATE(cast(@i as nvarchar)+'我是柳永法',1000),4000)) 
  24.         insert into [testnvarcharmax] values(LEFT(REPLICATE(cast(@i as nvarchar)+'我是柳永法',1000),4000)) 
  25.         set @i=@i+1 
  26.     END 
  27. COMMIT 
  28.  
  29.  
  30. --清空缓存,或重启SQL服务,测试查询速度及lob读取情况(lob是大对象的意思) 
  31. --测试testnvarcharmax 
  32. DBCC DROPCLEANBUFFERS 
  33. DBCC FREEPROCCACHE 
  34.  
  35. SET STATISTICS IO ON  
  36. SET STATISTICS TIME ON 
  37. SELECT  COUNT(*) 
  38. FROM    testnvarcharmax 
  39. WHERE   cnt LIKE '%柳永法%' 
  40.  
  41. SET STATISTICS TIME OFF 
  42. SET STATISTICS IO OFF 
  43.  
  44. --测试testnvarchar4000 
  45. DBCC DROPCLEANBUFFERS 
  46. DBCC FREEPROCCACHE 
  47.  
  48. SET STATISTICS IO ON  
  49. SET STATISTICS TIME ON 
  50. SELECT  COUNT(*) 
  51. FROM    testnvarchar4000 
  52. WHERE   cnt LIKE '%柳永法%' 
  53.  
  54. SET STATISTICS TIME OFF 
  55. SET STATISTICS IO OFF 
  56.  
  57.  
  58. --结果: 
  59. --(1 行受影响) 
  60. --表 'testnvarcharmax'。扫描计数 3,逻辑读取 100000 次,物理读取 8494 次,预读 99908 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。 
  61. -- 
  62. -- SQL Server 执行时间: 
  63. --   CPU 时间 = 1172 毫秒,占用时间 = 30461 毫秒。 
  64.  
  65.  
  66. --(1 行受影响) 
  67. --表 'testnvarchar4000'。扫描计数 3,逻辑读取 100000 次,物理读取 8523 次,预读 99916 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。 
  68. -- 
  69. -- SQL Server 执行时间: 
  70. --   CPU 时间 = 968 毫秒,占用时间 = 30038 毫秒。 
  71.  
  72.  
  73. --从结果可以看出,这两次读取时间基本相同,并且都没有lob读取,以上数据为多次测试结果。 
  74.  
  75.  
  76.  
  77. --给testnvarcharmax前1000条字段长度+1,来测试是不是超过4000字就会使用lob读取 
  78. UPDATE testnvarcharmax SET cnt=cnt+'1' WHERE id <=1000 
  79.  
  80. --结果: 
  81.  
  82. --(1 行受影响) 
  83. --表 'testnvarcharmax'。扫描计数 3,逻辑读取 100000 次,物理读取 8292 次,预读 99696 次,lob 逻辑读取 900 次,lob 物理读取 83 次,lob 预读 0 次。 
  84. -- 
  85. -- SQL Server 执行时间: 
  86. --   CPU 时间 = 1124 毫秒,占用时间 = 30318 毫秒。 
  87.  
  88. --此结果显示使用了lob读取。但时间相差也不太大。 
  89.  
  90.  
  91. --字段值加倍,再测试: 
  92. UPDATE testnvarcharmax SET cnt=cnt+cnt WHERE id <=1000 
  93. --结果: 
  94.  
  95. --(1 行受影响) 
  96. --表 'testnvarcharmax'。扫描计数 3,逻辑读取 100000 次,物理读取 8164 次,预读 99521 次,lob 逻辑读取 1000 次,lob 物理读取 101 次,lob 预读 0 次。 
  97. -- 
  98. -- SQL Server 执行时间: 
  99. --   CPU 时间 = 1094 毫秒,占用时间 = 31095 毫秒。 

从以上结果基本上可以证明自己文章头提到的观点,nvarchar(n)或nvarchar(max)中的n及max只是一个符号,不会影响占用空间及性能,除非max存储字符数大于4000,所以我们只要关注实际业务需要就可以了,

设为首页 | 加入收藏 | 网学首页 | 原创论文 | 计算机原创
版权所有 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
Copyright 2008-2020 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号 常年法律顾问:王律师