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

SQLServer2005 varchar 长度 问题
SQLServer2005 中数据类型
varchar 长度最大可以到8000
其存储策略是按需存储 例如有300字节就使用300字节 另外有两个字节存储内容的偏移
我的问题是
既然这样 那我们设计时都把varchar设为8000行么?
反正是按需存储
就是不知道性能上有否影响?

------解决方案--------------------
另外 2005最大的是varchar(max)
可以存储2G
------解决方案--------------------
SQL code
【IT168技术文档】
    本次测试的SQL SERVER 2000 的char 与 varchar。

    测试分三组,每次增加插入的行数,脚本如下: 
CREATE TABLE [dbo].[testchar] (
[a] [int] IDENTITY (1, 1) NOT NULL ,
[b] [char] (200) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[testvarchar] (
[a] [int] IDENTITY (1, 1) NOT NULL ,
[b] [varchar] (200) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO
--truncate table testvarchar
--truncate table testchar
declare @i as int
set @i=0
while @i<50000
begin
insert into testvarchar values(cast(@i as varchar(200)))
set @i=@i+1
if @i=50000
break
end
declare @i as int
set @i=0
while @i<50000
begin
insert into testchar values(cast(@i as char(200)))
set @i=@i+1
if @i=50000
break
end

 
     实验结果:

插入行数
 数据类型
 Cpu
 duration
 
50000
 varchar
 2359
 21203
 
50000
 char
 2344
 22250
 
100000
 varchar
 4156
 44500
 
100000
 char
 4172
 44186
 
2000000
 varchar
 8907
 89093
 
2000000
 char
 9188
 96530
 

     两表存储空间比较
     Testchar:73.94M
     Testvarchar:7.94M

------解决方案--------------------
如果 varchar(300) 和 varchar(8000) 都存储相同的字符数,性能上是没有差别的,存储行为上也没有不同。因为它们都有相同的存储结构,两个字节的偏移,两个字节的列数(如果表中所有的列都是 varchar 类型)。区别只在于存储容量上。

大多数的性能比较都集中在 varchar 和 char,varchar 和 varchar(max) 上。还有,行外存储(SQL Server 2005 支持的)。

------解决方案--------------------
SQLServer2005 中数据类型
varchar 长度最大可以到8000 
--这是不对的,SQL2005varchar最大长度可到2G字节.

------解决方案--------------------
SQL code
设置为varchar(8000)的话容易产生不可利用的空闲磁盘块儿,这不太经济!
大量不可利用的空闲磁盘块儿加剧数据的分散存储,在一定程度上影响了数据库各方面的性能!

------解决方案--------------------

SQL code


0)
DECLARE @str varchar(MAX)
SET @str = REPLICATE('*',8003)
SELECT LEN(@str)

1)
--------------------
8000

(1 row(s) affected)

------解决方案--------------------
通过行结构 可以看到无论你定义的VARCHAR()是多长 
只要你插入的实际长度是一样的,那么它就存这么长。
所以没有性能差别
------解决方案--------------------
长度除了存储的原因,更多是管理的需要。如身份证号码21位,如长度超出,数据即不能插入