varchar(500)通过varchar(8000)有优势吗?
我已经阅读了MSDN论坛上的这个,我还不清楚。 我认为这是正确的:Varchar(max)将被存储为文本数据types,所以有缺点。 所以,让我们说你的领域将可靠地低于8000个字符。 像我的数据库表中的BusinessName字段一样。 事实上,一个企业名称可能总是在500个字符以下(拉出一个数字)。 我似乎有很多varchar字段在8k字符数下运行。
所以我应该使该字段varchar(500),而不是varchar(8000)? 从我所了解的SQL来看,这两者之间没有任何区别。 所以,为了使生活变得简单,我想将所有的varchar字段定义为varchar(8000)。 这有什么缺点吗?
相关: varchar列的大小 (我不觉得这个回答我的问题)。
从处理的angular度来看,使用varchar(8000)vs varchar(500)并没有什么不同。 定义一个字段应该容纳的最大长度并且使你的varchar长度是一个“好习惯”。 这可以用来协助数据validation。 例如,将州名缩写为2个字符或邮政编码为5或9个字符。 当数据与其他系统或字段长度非常关键的用户界面(例如大型机平面文件数据集)交互时,这是一个更重要的区别,但是现在我认为它比其他任何东西都更为习惯。
这可以有所作为的一个例子是,它可以阻止性能优化,避免将行版本信息添加到具有after触发器的表中。
这是由SQL Kiwi在这里
所存储数据的实际大小并不重要 – 这是潜在的大小。
另一个声明列宽可能会产生很大不同的情况是,如果该表使用SSIS进行处理。 分配给可变长度(非BLOB)列的内存对于执行树中的每一行都是固定的,并且是按列声明的最大长度,这可能导致内存缓冲区(示例)的低效率使用。 虽然SSIS软件包开发人员可以声明比源代码更小的列大小,但是这个分析最好在前面完成,然后在那里执行。
回到SQL Server引擎本身,类似的情况是,在计算分配给SORT
操作的内存授予时,SQL Server假定varchar(x)
列将平均占用x/2
个字节。
如果大部分的varchar
列都比这个更丰富,这可能会导致溢出到tempdb
的sort
操作。
在你的情况下,如果你的varchar
列被声明为8000
字节,但实际上有内容远远less于你的查询将被分配内存,它并不需要这显然是低效的,可以导致等待内存授予。
SQL Workshops网上直播1的第二部分将介绍这方面的内容,或者从这里下载 。
use tempdb; CREATE TABLE T( id INT IDENTITY(1,1) PRIMARY KEY, number int, name8000 VARCHAR(8000), name500 VARCHAR(500)) INSERT INTO T (number,name8000,name500) SELECT number, name, name /*<--Same contents in both cols*/ FROM master..spt_values SELECT id,name500 FROM T ORDER BY number
SELECT id,name8000 FROM T ORDER BY number
除了最佳实践(BBlake的回答)
- 您会收到有关使用DDL的最大行大小(8060)字节和索引宽度(900字节)的警告
- 如果超出这些限制,DML将会死亡
- ANSI PADDING ON是默认的,所以你最终可以存储一大堆的空白
大柱子有一些缺点,不太明显,稍后可能会引起你的注意:
- 在INDEX中使用的所有列 – 不得超过900个字节
- ORDER BY子句中的所有列不得超过8060个字节。 这有点难以掌握,因为这只适用于某些栏目。 有关详细信息,请参阅SQL 2008 R2超出行大小限制 )
- 如果总行大小超过8060字节,则会为该行获得“ 页面溢出 ”。 这可能会影响性能(一个页面是SQLServer中的一个分配单元,固定在8000字节+一些开销,超过这个不会太严重,但这是显而易见的,如果你愿意,你应该尽量避免)
- 许多其他的内部数据结构,缓冲区和最后 – 而不是你自己的variables和表variables都需要反映这些大小。 如果大小过大, 内存分配过多会影响性能
一般来说,尽量保持列宽。 如果出现问题,可以轻松扩展以适应需求。 如果您稍后注意到内存问题,稍后收缩宽的列可能会变得不可能,而且不会丢失数据,并且您不知道从哪里开始。
在你的商业名称的例子中,想想你能在哪里展示它们。 真的有500个字符的空间吗? 如果不是这样,那么存储它们就没有意义了。 http://en.wikipedia.org/wiki/List_of_companies_of_the_United_States列出了一些公司名称,最多约50个字符。; 所以我会使用100列的最大值。 也许更像80。
理想情况下,你会希望比这个尺寸小一些,直到尺寸合理(500尺寸不合理),并确保客户端validation在数据量过大时发送,并发送一个有用的错误。
虽然varchar实际上并没有在数据库中为未使用的空间预留空间,但是我还记得SQL Server的版本中有一个关于数据库行宽度比一些字节宽的事情(不记得确切的数字),实际上抛出任何数据都不适合。 一定数量的这些字节是为SQL Server内部的东西保留的。