在SQL Server 2005中,将所有字符字段设置为nvarchar(MAX)而不是显式指定长度是否有任何缺点,例如nvarchar(255)?(除了不能在数据库级别限制字段长度这一显而易见的问题之外)
发布于 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
发布于 2009-06-08 19:33:14
有时,您希望数据类型对其中的数据强制执行某种意义。
比方说,你有一个列,它的长度不应该超过20个字符。如果将该列定义为VARCHAR(MAX),某些恶意应用程序可能会在其中插入一个长字符串,而您永远不会知道,也没有任何方法可以防止这种情况发生。
当您的应用程序下一次使用该字符串时,假设该字符串的长度对于它所表示的域来说是适度且合理的,那么您将会遇到一个不可预测的、令人困惑的结果。
发布于 2014-09-30 20:12:39
我查看了一些文章,从中找到了有用的测试脚本:http://www.sqlservercentral.com/Forums/Topic1480639-1292-1.aspx然后将其更改为NVARCHAR(10)与NVARCHAR(4000)与NVARCHAR( MAX )之间的比较,并且我没有发现使用指定数字时的速度差异,而是使用MAX时的速度差异。你可以自己测试。希望这能有所帮助。
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
https://stackoverflow.com/questions/148398
复制相似问题