当前位置: 代码迷 >> Sql Server >> 为啥sql server的字符串不一直都用varchar(max)
  详细解决方案

为啥sql server的字符串不一直都用varchar(max)

热度:39   发布时间:2016-04-27 12:09:25.0
为什么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 offuse tempdbgo--drop table tb1create table tb1(id int identity primary key,a varchar(40),b varchar(max))goinsert into tb1(a,b) select NEWID(),REPLICATE('a',2000)go 10000 --drop table tb2create table tb2(id int identity primary key,a varchar(40),b varchar(max))gosp_tableoption 'tb2','large value types out of row',1goinsert into tb2 (a,b) select NEWID(),REPLICATE('a',2000)go 10000set statistics io onselect COUNT(*) from tb1select COUNT(*) from tb2
  相关解决方案