我们针对三种类型表实测一下性能,都同样插入30万条记录,再查询其中一条记录,来测试插入性能和查询性能;
第一次我们对查询字段不建立索引。
第二次我们对需要查询的字段建立唯一索引。
测试结果:
表变量插入快,查询快;
临时表插入快,查询慢;
普通表插入慢,查询慢
加索引后,插入速度略微变慢,查询速度明显提升。
下面是实测的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,版本比较老,不知其它版本测试结果如何。