Char 和Varchar 查询速度、存储空间比较详解


  一。数据行结构  
  char(n):   系统分配n个字节给此字段,不管字段实际长度(后边用空格补齐)  
   
  varchar(n):   假设表中有M个varchar(或者nvarchar)类型的字段  
      先分配两个字节(用来表示M)  
      再分配2*M个字节(表示各变长行的偏移)  
      此后字段值有多长,就分配多长  
   
  二。varchar(n)一定比char(n)节省空间么?  
  不一定。  
  我见过这样的设计:   varchar(3)  
  就算此字段为空,也还是比char(3)多用一个字节。  
   
  还有这样的设计:   user_ip   varchar(16).  
  对于这种数据长度变化不大的字段,用varchar只能浪费空间  
   
  结论:   varchar适用于数据值长度不太短,且长度变化较大的字段  
   
  三。char(n)一定比varchar(n)速度快么?  
  不一定  
  计算varchar的偏移是会花去一些cpu时间,但性能瓶颈不在此,在io.  
  db的io单位是数据页(8192字节)(一页存有多个数据行,数据行不能跨页。当然image,text等例外).  
  因此一页中行越多,性能越好。这样就又归结到前边的问题了  
   
  遗留问题:对于频繁更新的表,varchar是否会导致分页等问题?影响程度  
  如何?望有兴趣的朋友关注。

以前就发过这样的贴啊!  
   
  下面是引用邹老大的:  
   
  效率和存储空间本来就是矛盾的,   如果你从这个角度来理解我说的,   那就是矛盾的.  
   
  另外,   在存储空间上,     javanow(想我生命的意义)   是正确的.   用sp_spaceused就可以简单地看到存储空间,   可以说明char/varchar在存储处理上的差别.  
   
  示例:  
   
  USE   tempdb  
  GO  
   
  CREATE   TABLE   t1(a   char(8000))  
  CREATE   TABLE   t2(a   varchar(8000))  
  GO  
   
  INSERT   t1   SELECT   TOP   100   ''   FROM   syscolumns  
  INSERT   t2   SELECT   TOP   100   ''   FROM   syscolumns  
  GO  
   
  EXEC   sp_spaceused   't1'  
  EXEC   sp_spaceused   't2'  
  GO  
   
  DROP   TABLE   t1,t2  
   
   
  --   结果,   同样的100条记录,   t1表的data空间是800KB,   则t2是8KB  
  --   SQL   Server是如何存储数据的,   一看就明白.  
   
  而在检索上,   就算不考虑索引,   char是定长的,   移动到下一条记录,   只需要做固定长度的指针偏移即可.   varchar则必须根据当前记录的长度算出下一个数据指针的偏移.