varchar与char查询速度的比较
2008-06-03 13:28 豆包也是干粮 阅读(4537) 评论(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的性能优势就月明显。但是这个不是线性的比例。
实际的验证模型如下:在数据库中建立两个表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的性能优势就月明显。但是这个不是线性的比例。