日期:2014-05-18  浏览次数:20471 次

为什么sql server的字符串不一直都用varchar(max)
varchar(n)的实际字符串存储空间跟字符串的实际大小相关,而跟n的值无关,既然如此,为什么不一直用varchar(max)呢?这样可以很大程度上防止字符串长度不够用,又不会占用多余的空间。n的值会造成什么影响呢?会影响时间效率吗?如果会的话,可以详细解释或给出相关资料吗?

------解决方案--------------------
varchar(max)是2005开始才开始有的
------解决方案--------------------
可能认为varchar 是自动取长的,那么所有的都设置成varchar(8000)岂不乐乎
这个确实没有什么不良后果,唯一的缺陷可能就是谁会注入很长的垃圾数据。不过这个你应该是程序段的bug
但是能预知长度的最好根据实际情况设置.

varhcar(max) 这个东西就另当别论了。
varchar(max)和其它字段同存在一个行里,会减少一个page存数据的行数 
这样在查询数据的时候,就会导致需要扫描的page增多 性能就下降了
varchar(max) 可以再列中只存一个地址(好比指针吧),也可以存实际的数据。
看下面的例子,两者的差距很明显的
SQL code
set statistics io off
use tempdb
go
--drop table tb1
create table tb1(id int identity primary key,a varchar(40),b varchar(max))
go
insert into tb1(a,b) select NEWID(),REPLICATE('a',2000)
go 10000

 
--drop table tb2
create table tb2(id int identity primary key,a varchar(40),b varchar(max))
go
sp_tableoption 'tb2','large value types out of row',1
go
insert into tb2 (a,b) select NEWID(),REPLICATE('a',2000)
go 10000

set statistics io on
select COUNT(*) from tb1
select COUNT(*) from tb2