今天在CSDN的SQL server 版块里面碰见一个sql提问,就是:
“
有三个表 table2008,table2009,table2010
其中table2008这个表存的是08年的数据,table2009这个表存的是09年的数据,table2010这个表存的是10年的数据
三个表的表字段名都一样 其中有内容字段 content, 开始时间 start_time,结束时间 end_time 等等,
求大家帮写条语名查找出从08年某个时间段到10年某个时间段 内容字段 content相同的数据
”
在所有各位大大给的答案中,主要有两种方法解决。如下:
SELECT * FROM
(
SELECT * FROM TABLE2008
UNION ALL
SELECT * FROM TABLE2009
....
)AS T WHERE 条件
或者
SELECT * FROM TABLE2008 WHERE 条件
UNION ALL
SELECT * FROM TABLE2009 WHERE 条件
....
现在我们来研究一下到底哪中方法的效率要高些呢?或者两者一样?...
我们先把这个题目放下,看我下面的测试数据,条件就不要时间了,我只要Id即可,每个表中1000000条测试:
if OBJECT_ID('table2008') is not null drop table table2008
go
select top 1000000 id=identity(int,1,1) into table2008
from syscolumns a,syscolumns b,syscolumns c,syscolumns d
go
if OBJECT_ID('table2009') is not null drop table table2009
go
select top 1000000 id=identity(int,1,1) into table2009
from syscolumns a,syscolumns b,syscolumns c,syscolumns d
go
if OBJECT_ID('table2010') is not null drop table table2010
go
select top 1000000 id=identity(int,1,1) into table2010
from syscolumns a,syscolumns b,syscolumns c,syscolumns d
go
我测试的sql脚本为一下,测试结构也在下面
select * from
(
select * from table2008
union all
select * from table2009
union all
select * from table2010
) t where id >=800000
--所需时间【00:01:32】 条件:【id >=1】,没有加聚集索引
--所需时间【00:01:24】 条件:【id >=50000】, 没有加聚集索引
--所需时间【00:00:44】 条件:【id >=500000】, 没有加聚集索引
--所需时间【00:00:42】 条件:【id >=500000】, 加了聚集索引
--所需时间【00:00:17】 条件:【id >=800000】, 加了聚集索引
go
select * from table2008 where id >=800000
union all
select * from table2009 where id >=800000
union all
select * from table2010 where id >=800000
--所需时间【00:01:27】 条件:【id >=1】, 没有加聚集索引
--所需时间【00:01:17】 条件:【id >=50000】, 没有加聚集索引
--所需时间【00:00:42】 条件:【id >=500000】, 没有加聚集索引
--所需时间【00:00:42】 条件:【id >=500000】, 加了聚集索引
--所需时间【00:00:17】 条件:【id >=800000】, 加了聚集索引
结论:[自己电脑测试]
没有加索引的时候第二种的需要时间要少些,即是第二种的方法好些。
加了索引的时候,两种方法所需的时间一样,即两种方法一样。