SqlServer中,表变量、临时表、普通磁盘表,插入和查询性能实测

我们针对三种类型表实测一下性能,都同样插入30万条记录,再查询其中一条记录,来测试插入性能和查询性能;

第一次我们对查询字段不建立索引。

SqlServer中,表变量、临时表、普通磁盘表,插入和查询性能实测_第1张图片

 第二次我们对需要查询的字段建立唯一索引。

SqlServer中,表变量、临时表、普通磁盘表,插入和查询性能实测_第2张图片

 

测试结果:

SqlServer中,表变量、临时表、普通磁盘表,插入和查询性能实测_第3张图片

 

表变量插入快,查询快;

临时表插入快,查询慢;

普通表插入慢,查询慢

加索引后,插入速度略微变慢,查询速度明显提升。

下面是实测的SQL:

无索引:

--日志记录

DECLARE @log TABLE(table_name varchar(10),insert_ms int,select_ms int) ;

DECLARE @i int

DECLARE @date1 datetime;

DECLARE @insert_ms int;--插入时间记录

DECLARE @select_ms int;--查询时间记录

DECLARE @temp int;--临时

--表变量

DECLARE @tb1 TABLE(myid int,mytext varchar(10)) ;

SET @date1=getdate();

SET @i=1

WHILE @i<300000

BEGIN

insert into @tb1 values(@i,'表变量')

set @i=@i+1

end

SET @insert_ms = DATEDIFF ( millisecond,@date1,getdate())

set @date1=getdate();

SELECT @temp=NULL FROM @tb1 WHERE myid=25545;

SET @select_ms = DATEDIFF (millisecond,@date1,getdate())

INSERT INTO @log(table_name,insert_ms,select_ms) VALUES('表变量',@insert_ms,@select_ms)



--临时表

CREATE TABLE #tb2(myid int,mytext varchar(10)) ;

set @date1=getdate();

SET @i=1

WHILE @i<300000

BEGIN

insert into #tb2 values(@i,'临时表')

SET @i=@i+1

END

SET @insert_ms = DATEDIFF ( millisecond,@date1,getdate())

SET @date1=getdate();

SELECT @temp=NULL FROM #tb2 WHERE myid=25545;

SET @select_ms = DATEDIFF (millisecond,@date1,getdate())

INSERT INTO @log(table_name,insert_ms,select_ms) VALUES('临时表',@insert_ms,@select_ms)

DROP TABLE #tb2

--磁盘表

CREATE TABLE tb3(myid int,mytext varchar(10)) ;

set @date1=getdate();

SET @i=1

WHILE @i<300000

BEGIN

insert into tb3 values(@i,'磁盘表')

set @i=@i+1

end

SET @insert_ms = DATEDIFF ( millisecond,@date1,getdate())

set @date1=getdate();

SELECT @temp=NULL FROM tb3 WHERE myid=25545;

SET @select_ms = DATEDIFF (millisecond,@date1,getdate())

INSERT INTO @log(table_name,insert_ms,select_ms) VALUES('磁盘表',@insert_ms,@select_ms)

DROP TABLE tb3

SELECT table_name 表类型,insert_ms 插入耗时_毫秒,select_ms 查询耗时_毫秒 FROM @log

有索引:

--日志记录

DECLARE @log TABLE(table_name varchar(10),insert_ms int,select_ms int) ;

DECLARE @i int

DECLARE @date1 datetime;

DECLARE @insert_ms int;--插入时间记录

DECLARE @select_ms int;--查询时间记录

DECLARE @temp int;--临时

--表变量

DECLARE @tb1 TABLE(myid int UNIQUE ,mytext varchar(10)) ;

SET @date1=getdate();

SET @i=1

WHILE @i<300000

BEGIN

insert into @tb1 values(@i,'表变量')

set @i=@i+1

end

SET @insert_ms = DATEDIFF ( millisecond,@date1,getdate())

set @date1=getdate();

SELECT @temp=NULL FROM @tb1 WHERE myid=25545;

SET @select_ms = DATEDIFF (millisecond,@date1,getdate())

INSERT INTO @log(table_name,insert_ms,select_ms) VALUES('表变量',@insert_ms,@select_ms)



--临时表

CREATE TABLE #tb2(myid int UNIQUE,mytext varchar(10)) ;

set @date1=getdate();

SET @i=1

WHILE @i<300000

BEGIN

insert into #tb2 values(@i,'临时表')

SET @i=@i+1

END

SET @insert_ms = DATEDIFF ( millisecond,@date1,getdate())

SET @date1=getdate();

SELECT @temp=NULL FROM #tb2 WHERE myid=25545;

SET @select_ms = DATEDIFF (millisecond,@date1,getdate())

INSERT INTO @log(table_name,insert_ms,select_ms) VALUES('临时表',@insert_ms,@select_ms)

DROP TABLE #tb2

--磁盘表

CREATE TABLE tb3(myid int UNIQUE,mytext varchar(10)) ;

set @date1=getdate();

SET @i=1

WHILE @i<300000

BEGIN

insert into tb3 values(@i,'磁盘表')

set @i=@i+1

end

SET @insert_ms = DATEDIFF ( millisecond,@date1,getdate())

set @date1=getdate();

SELECT @temp=NULL FROM tb3 WHERE myid=25545;

SET @select_ms = DATEDIFF (millisecond,@date1,getdate())

INSERT INTO @log(table_name,insert_ms,select_ms) VALUES('磁盘表',@insert_ms,@select_ms)

DROP TABLE tb3

SELECT table_name 表类型,insert_ms 插入耗时_毫秒,select_ms 查询耗时_毫秒 FROM @log

测试环境是SQL2008,版本比较老,不知其它版本测试结果如何。

你可能感兴趣的:(sqlserver,数据库,sql)