热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

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

 

-- --------------------------------------------------------------------------------
--
 Subject     : nvarchar(n)及nvarchar(max)中的n及max是否会影响性能
--
 Author      : 柳永法(yongfa365) http://www.yongfa365.com/ yongfa365@qq.com
--
 CreateDate  : 2010-11-22 23:31:04
--
 Environment : Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (Intel X86) 
--
               Apr  2 2010 15:53:02 
--
               Copyright (c) Microsoft Corporation
--
               Enterprise Evaluation Edition on Windows NT 5.2  (Build 3790: Service Pack 2)
--
--------------------------------------------------------------------------------
--
首先创建两个表,一个放nvarchar(4000),一个放nvarchar(max)

CREATE   TABLE   [ dbo ] . [ testnvarchar4000 ]  (
id 
int   IDENTITY  ( 1 1 ) ,
cnt 
nvarchar ( 4000 )

GO
CREATE   TABLE   [ dbo ] . [ testnvarcharmax ]  (
id 
int   IDENTITY  ( 1 1 ) ,
cnt 
nvarchar ( max )


GO

-- 然后插入10万条数据,每个cnt里放4000个字符(nvarchar(n)里n的最大值),大约1.6G


BEGIN   TRANSACTION
    
DECLARE   @i   INT  ;
    
SET   @i   =   0  ;
    
while   @i < 100000
    
begin
        
insert   into   [ testnvarchar4000 ]   values ( LEFT ( REPLICATE ( cast ( @i   as   nvarchar ) + ' 我是柳永法 ' , 1000 ), 4000 ))
        
insert   into   [ testnvarcharmax ]   values ( LEFT ( REPLICATE ( cast ( @i   as   nvarchar ) + ' 我是柳永法 ' , 1000 ), 4000 ))
        
set   @i = @i + 1
    
END
COMMIT


-- 清空缓存,或重启SQL服务,测试查询速度及lob读取情况(lob是大对象的意思)
--
测试testnvarcharmax
DBCC  DROPCLEANBUFFERS
DBCC  FREEPROCCACHE

SET   STATISTICS  IO  ON  
SET   STATISTICS  TIME  ON
SELECT    COUNT ( * )
FROM     testnvarcharmax
WHERE    cnt  LIKE   ' %柳永法% '

SET   STATISTICS  TIME  OFF
SET   STATISTICS  IO  OFF

-- 测试testnvarchar4000
DBCC  DROPCLEANBUFFERS
DBCC  FREEPROCCACHE

SET   STATISTICS  IO  ON  
SET   STATISTICS  TIME  ON
SELECT    COUNT ( * )
FROM     testnvarchar4000
WHERE    cnt  LIKE   ' %柳永法% '

SET   STATISTICS  TIME  OFF
SET   STATISTICS  IO  OFF


-- 结果:
--
(1 行受影响)
--
表 'testnvarcharmax'。扫描计数 3,逻辑读取 100000 次,物理读取 8494 次,预读 99908 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
--
--
 SQL Server 执行时间:
--
   CPU 时间 = 1172 毫秒,占用时间 = 30461 毫秒。


-- (1 行受影响)
--
表 'testnvarchar4000'。扫描计数 3,逻辑读取 100000 次,物理读取 8523 次,预读 99916 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
--
--
 SQL Server 执行时间:
--
   CPU 时间 = 968 毫秒,占用时间 = 30038 毫秒。


-- 从结果可以看出,这两次读取时间基本相同,并且都没有lob读取,以上数据为多次测试结果。



-- 给testnvarcharmax前1000条字段长度+1,来测试是不是超过4000字就会使用lob读取
UPDATE  testnvarcharmax  SET  cnt = cnt + ' 1 '   WHERE  id  <= 1000

-- 结果:

-- (1 行受影响)
--
表 'testnvarcharmax'。扫描计数 3,逻辑读取 100000 次,物理读取 8292 次,预读 99696 次,lob 逻辑读取 900 次,lob 物理读取 83 次,lob 预读 0 次。
--
--
 SQL Server 执行时间:
--
   CPU 时间 = 1124 毫秒,占用时间 = 30318 毫秒。

-- 此结果显示使用了lob读取。但时间相差也不太大。


-- 字段值加倍,再测试:
UPDATE  testnvarcharmax  SET  cnt = cnt + cnt  WHERE  id  <= 1000
-- 结果:

-- (1 行受影响)
--
表 'testnvarcharmax'。扫描计数 3,逻辑读取 100000 次,物理读取 8164 次,预读 99521 次,lob 逻辑读取 1000 次,lob 物理读取 101 次,lob 预读 0 次。
--
--
 SQL Server 执行时间:
--
   CPU 时间 = 1094 毫秒,占用时间 = 31095 毫秒。

 

 

 

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

更多结果见: http://www.yongfa365.com/Item/SQLServer-varchar-nvarchar.html

 



推荐阅读
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了brain的意思、读音、翻译、用法、发音、词组、同反义词等内容,以及脑新东方在线英语词典的相关信息。还包括了brain的词汇搭配、形容词和名词的用法,以及与brain相关的短语和词组。此外,还介绍了与brain相关的医学术语和智囊团等相关内容。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • Windows7 64位系统安装PLSQL Developer的步骤和注意事项
    本文介绍了在Windows7 64位系统上安装PLSQL Developer的步骤和注意事项。首先下载并安装PLSQL Developer,注意不要安装在默认目录下。然后下载Windows 32位的oracle instant client,并解压到指定路径。最后,按照自己的喜好对解压后的文件进行命名和压缩。 ... [详细]
  • 嵌入式处理器的架构与内核发展历程
    本文主要介绍了嵌入式处理器的架构与内核发展历程,包括不同架构的指令集的变化,以及内核的流水线和结构。通过对ARM架构的分析,可以更好地理解嵌入式处理器的架构与内核的关系。 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
author-avatar
小桃爱学PHP
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有