首页 / 知识
varchar和nvarchar SQL Server数据类型之间的主要性能差异是什么?
2023-04-13 16:18:00

What are the main performance differences between varchar and nvarchar SQL Server data types?
我正在使用 我开始看到视图2的优点。我知道nvarchar确实占用了两倍的空间,但这不一定是一个大问题,因为这只是为几百名学生存储数据。 对我而言,似乎最简单的是不要担心它并且只允许一切使用nvarchar。 还是有什么我想念的?
磁盘空间不是问题...但内存和性能将是。 您需要存储中文等脚本吗?是还是不是... 从MS BOL"Unicode的存储和性能影响" 编辑: 最近的SO问题突出了nvarchar性能有多糟糕...... 在nvarchar字符串中搜索时,SQL Server使用高CPU 始终使用nvarchar。 对于大多数应用程序,您可能永远不需要双字节字符。但是,如果您需要支持双字节语言,并且数据库模式中仅支持单字节,那么回头修改整个应用程序确实非常昂贵。 将一个应用程序从varchar迁移到nvarchar的成本将比您在大多数应用程序中将使用的额外磁盘空间少得多。 始终如一!将VARCHAR加入到NVARCHAR中会有很大的性能影响。 nvarchar将在内存,存储,工作集和索引编制上有大量开销,因此,如果规范指示确实不需要,则不要打扰。 我不会有一个坚硬而快速的"永远nvarchar"规则,因为在许多情况下它可能是完全浪费 - 特别是来自ASCII / EBCDIC的ETL或通常是键和外键的标识符和代码列。 另一方面,有很多列的情况,我肯定会提前问这个问题,如果我没有立即得到一个快速的答案,我会把列设为nvarchar。 对于您的应用程序,nvarchar很好,因为数据库大小很小。说"总是使用nvarchar"是一个巨大的过度简化。如果你不需要存储像汉字或其他疯狂字符这样的东西,使用VARCHAR,它将使用更少的空间。我的前任在我目前的工作中使用NVARCHAR设计了一些不需要的东西。我们最近将其切换为VARCHAR,仅在该表上保存了15 GB(已被高度写入)。此外,如果您在该表上有一个索引,并且想要包括该列或创建一个复合索引,则只需增加索引文件的大??小即可。 考虑一下您的决定;在SQL开发和数据定义中,似乎很少有"默认答案"(当然,除了不惜一切代价避免使用游标)。 我犹豫在这里添加另一个答案,因为已经有很多答案了,但是需要提出一些尚未提出或没有明确提出的观点。
第一:不要总是使用 你唯一应该使用"永远"这个词的时候就是建议"总是做最适合这种情况的事情"。当然,这通常很难确定,尤其是在试图平衡开发时间的短期收益时(经理:"我们需要这个功能-您直到一周前才知道的功能!")定期维护成本(最初向团队施加压力,要求其在3周的冲刺中完成3个月的项目的经理:"我们为什么会遇到这些性能问题?我们怎么可能做X却没有灵活性?我们负担不起一两个冲刺来解决这个问题。我们可以在一周内完成什么工作,以便我们可以回到我们的优先项目?我们肯定需要在设计上花更多的时间,所以这不会继续发生!")。 第二:@gbn的答案涉及一些非常重要的要点,当路径不是100%清晰时,在做出某些数据建模决策时要考虑。但是,还有更多需要考虑的问题: 浪费空间对整个系统产生巨大的级联效应。我写了一篇文章,详细介绍了该主题:磁盘便宜! ORLY? (需要免费注册;抱歉,我不控制该政策)。 第三:虽然一些答案错误地侧重于"这是一个小应用程序"方面,而一些答案正确地建议"使用适当的东西",但没有一个答案为OP提供了真正的指导。问题中提到的重要细节这是他们学校的网页。大!因此,我们建议:
第四:既然你有
如果您使用的是SQL Server 2008 - 2016 RTM且在Enterprise Edition上,或者如果使用SQL Server 2016 SP1(在所有版本中都提供了数据压缩)或更新版本,则可以启用数据压缩。数据压缩可以(但不会"始终")压缩
如果使用SQL Server 2005或2008 - 2016 RTM而不是Enterprise Edition,则可以有两个字段:一个
在此模型中,您只能从
您可以将传入的值GZIP转换为 如果使用SQL Server 2017或更高版本,则可以考虑将表格设置为Clustered Columnstore Index。
虽然这还不是一个可行的选择,但SQL Server 2019在 好。 由于您的应用程序很小,使用nvarchar而不是varchar基本上没有明显的成本增加,如果您需要存储unicode数据,您可以节省潜在的麻烦。
一般来说;从约束最少的最昂贵的数据类型开始。把它投入生产。如果性能开始成为问题,请找出实际存储在那些
我可以凭经验说,谨防 在过去的几年里,我们所有的项目都使用了NVARCHAR,因为所有这些项目都是多语言的。在插入数据库之前,从外部源(例如ASCII文件等)导入的数据被上转换为Unicode。 我还没有遇到来自较大索引等的任何与性能相关的问题。索引确实使用了更多内存,但内存很便宜。 无论您是使用存储过程还是动态构造SQL,都要确保所有字符串常量都以N为前缀(例如SET @foo = N'Hello world。';),因此常量也是Unicode。这样可以避免在运行时进行任何字符串类型转换。 因人而异。 我经常在工作中处理这个问题:
我仍然不会每次都使用nvarchar over varchar。如果对特殊字符有任何疑问或可能,我使用nvarchar。当我100%控制填充字段的内容时,我发现我主要使用varchar。 为什么在所有讨论中都没有提到UTF-8?能够存储完整的unicode字符范围并不意味着必须始终为每个字符分配两个字节(或"代码点"以使用UNICODE术语)。所有ASCII都是UTF-8。 SQL Server是否检查文本是严格ASCII的VARCHAR()字段(即顶部字节位为零)?我希望不会。 如果那时你想存储unicode并希望与旧的仅ASCII应用程序兼容,我认为使用VARCHAR()和UTF-8将是神奇的子弹:它只在需要时使用更多空间。 对于那些不熟悉UTF-8的人,我可能建议您阅读入门。 在某些特殊情况下,您需要故意限制数据类型以确保它不包含特定集合中的字符。例如,我有一个需要将域名存储在数据库中的方案。域名国际化在当时并不可靠,因此最好限制基层的输入,并有助于避免任何潜在的问题。
如果仅由于系统存储过程需要 |
最新内容
相关内容
python的数据类型
python的数据类型,数字,较大,数据,培训,变量,表示,字符串,赋值,常量,小数,1.整型Python可以处理任意大小的整数,当然包括负整数,在程序中的表示Python中的变量和数据类型
Python中的变量和数据类型,数据,变量,培训,地址,字符串,列表,数据类型,方法,字典,函数,python是一门弱数据类型的语言,变量不需要声明即可使用Python变量数据类型的转换
Python变量数据类型的转换,代码,数据,培训,信息,字符串,类型,变量,整数,浮点,函数,虽然Python是弱类型编程语言,不需要像Java或C语言那样还要Python中可以hash的数据类型
Python中可以hash的数据类型,数据,地址,策略,超额,检测,培训,平均,增长,示例,数据类型,在Python中,仅仅只有不可变数据类型可以被hash,然而每python怎样获取json数据类型?
python怎样获取json数据类型?,培训,数据类型,类型,正则,火狐,以上,方法,更多,内容,列表,python中获取json不同数据类型的方法:1、获取"key":vpython如何获取列表里的数据类型?
python如何获取列表里的数据类型?,代码,信息,培训,类型,数据类型,表里,元素,语句,函数,对象,1、Python可以通过tpye()方法来判断list里的元知实数是不是python的数据类型?
实数是不是python的数据类型?,数字,标准,培训,实数,数据类型,数轴,复数,有限小数,无理数,虚数,实数是python的数据类型。实数,是有理数和无理python常见的数据类型转换函数有哪
python常见的数据类型转换函数有哪些?,培训,数据类型,函数,python组合数据类型分为哪几类?
python组合数据类型分为哪几类?,培训,数据类型,python支持哪些数据类型
python支持哪些数据类型,数字,标准,指数,培训,系统,浮点,布尔,表示,类型,个位,python基本数据类型一般分为:数字、字符串、列表、元组、字典、python如何判断变量的数据类型
python如何判断变量的数据类型,数字,培训,标准,类型,数据类型,变量,布尔,数组,字符串,区别,python基本数据类型一般分为:数字、字符串、列表、python列表的数据类型分析
python列表的数据类型分析,分析,设计,一致,培训,元素,数据类型,列表,索引,实例,逻辑,python列表的数据类型分析说明1、设计出一种循环的数据