代码改变世界

varchar与char查询速度的比较

2008-06-03 13:28  豆包也是干粮  阅读(4527)  评论(1编辑  收藏  举报
     最近在做项目的数据库设计过程中,关于表字段存放字符类型是使用varchar还是使用char类型引起了很多的争论,争论的焦点在于是varchar与char的查询性能哪个高?争论了很长时间都没有具体的结论,我只有按照“实践出真理”的方针,在数据库中验证一下。:)
      实际的验证模型如下:在数据库中建立两个表ptrole和ptrole_2表
      ptrole表结构如下图:

            

     ptrole_2表结构如下图:
  
            

     delete from ptrole;
     delete from ptrole_2;

     declare @i as int
     set @i=0
    while @i<10000
    begin
       insert into ptrole(name) values('少华少华少
')      
      insert into ptrole_2(name) values('
少华少华少')

      set @i=@i + 1
    end


    select * from ptrole where name like '%少华%'
    select * from ptrole_2 where name like '%少华%'

    在ptrole和ptrole_2表中的name的字段中插入五个汉字,让name字段完全填充,这个时候我们通过执行

    select * from ptrole where name like '%少华%'
    select * from ptrole_2 where name like '%少华%'
    
     通过查看两条语句的执行计划如下:
   

  

   很明显当name字段完全填充的时候,使用name字段作为查询的条件时,char类型的性能要优于varchar
  
   下面我们再看看在name字段没有完全填充的情况下char类型的查询性能是否也优于varchar,这里我们将name的字段长度增加到40

 
     delete from ptrole;
     delete from ptrole_2;

     declare @i as int
     set @i=0
    while @i<10000
    begin
       insert into ptrole(name) values('少华
')      
      insert into ptrole_2(name) values('
少华')

      set @i=@i + 1
    end


    select * from ptrole where name like '%少华%'
    select * from ptrole_2 where name like '%少华%'

   查询语句的执行结果如下:
  

 

 从上面的执行结果上我们可以看出,在name字段不完全填充的情况下,char字段的查询性能要比varchar差,从上面的结果可以看出这个差距最少是一倍。
 
 如果字段的长度越大,在字段不完全填充的情况下,varchar的性能优势就月明显。但是这个不是线性的比例。