首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >总是使用nvarchar(MAX)有什么缺点吗?

总是使用nvarchar(MAX)有什么缺点吗?
EN

Stack Overflow用户
提问于 2008-09-29 12:01:12
回答 19查看 160.9K关注 0票数 364

在SQL Server 2005中,将所有字符字段设置为nvarchar(MAX)而不是显式指定长度是否有任何缺点,例如nvarchar(255)?(除了不能在数据库级别限制字段长度这一显而易见的问题之外)

EN

回答 19

Stack Overflow用户

发布于 2008-09-29 12:19:34

这是一个公平的问题,他确实声明了与明显的…不同

缺点可能包括:

性能影响查询优化器使用字段大小来确定最有效的执行计划

"1.数据库的扩展和页中的空间分配是灵活的。因此,当使用update向字段添加信息时,如果新数据比以前插入的数据长,则数据库必须创建一个指针。这将使数据库文件变得碎片化=从索引到删除、更新和插入几乎所有内容的性能都会降低。“http://sqlblogcasts.com/blogs/simons/archive/2006/02/28/Why-use-anything-but-varchar_2800_max_2900_.aspx

集成影响-其他系统很难知道如何与数据库集成不可预测的数据增长可能存在安全问题,例如,您可能会因为占用所有磁盘空间而使系统崩溃

这里有一篇好文章:http://searchsqlserver.techtarget.com/tip/1,289483,sid87_gci1098157,00.html

票数 56
EN

Stack Overflow用户

发布于 2009-06-08 19:33:14

有时,您希望数据类型对其中的数据强制执行某种意义。

比方说,你有一个列,它的长度不应该超过20个字符。如果将该列定义为VARCHAR(MAX),某些恶意应用程序可能会在其中插入一个长字符串,而您永远不会知道,也没有任何方法可以防止这种情况发生。

当您的应用程序下一次使用该字符串时,假设该字符串的长度对于它所表示的域来说是适度且合理的,那么您将会遇到一个不可预测的、令人困惑的结果。

票数 28
EN

Stack Overflow用户

发布于 2014-09-30 20:12:39

我查看了一些文章,从中找到了有用的测试脚本:http://www.sqlservercentral.com/Forums/Topic1480639-1292-1.aspx然后将其更改为NVARCHAR(10)与NVARCHAR(4000)与NVARCHAR( MAX )之间的比较,并且我没有发现使用指定数字时的速度差异,而是使用MAX时的速度差异。你可以自己测试。希望这能有所帮助。

代码语言:javascript
复制
SET NOCOUNT ON;

--===== Test Variable Assignment 1,000,000 times using NVARCHAR(10)
DECLARE @SomeString NVARCHAR(10),
        @StartTime DATETIME;
--=====         
 SELECT @startTime = GETDATE();
 SELECT TOP 1000000
        @SomeString = 'ABC'
   FROM master.sys.all_columns ac1,
        master.sys.all_columns ac2;
 SELECT testTime='10', Duration = DATEDIFF(ms,@StartTime,GETDATE());
GO
--===== Test Variable Assignment 1,000,000 times using NVARCHAR(4000)
DECLARE @SomeString NVARCHAR(4000),
        @StartTime DATETIME;
 SELECT @startTime = GETDATE();
 SELECT TOP 1000000
        @SomeString = 'ABC'
   FROM master.sys.all_columns ac1,
        master.sys.all_columns ac2;
 SELECT testTime='4000', Duration = DATEDIFF(ms,@StartTime,GETDATE());
GO
--===== Test Variable Assignment 1,000,000 times using NVARCHAR(MAX)
DECLARE @SomeString NVARCHAR(MAX),
        @StartTime DATETIME;
 SELECT @startTime = GETDATE();
 SELECT TOP 1000000
        @SomeString = 'ABC'
   FROM master.sys.all_columns ac1,
        master.sys.all_columns ac2;
 SELECT testTime='MAX', Duration = DATEDIFF(ms,@StartTime,GETDATE());
GO
票数 22
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/148398

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档