SQL Server 2008 R2:不同数据库表上的多个UNION

时间:2016-03-30 12:50:46

标签: sql sql-server sql-server-2008 sql-server-2008-r2 union

我有两个数据库,即db1db2

数据库db1包含1个表test1,数据库db2包含两个表test2test3

以下是包含一些演示记录的下表。

数据库db1 test1

Create table test1
(
    ID int,
    hrs int,
    dates date,
    st_date date,
    ed_date date
);

insert into test1 values(1,10,'2000-01-01','1900-01-01','2016-01-01');
insert into test1 values(2,20,'2000-02-01','1900-01-01','2016-01-01');
insert into test1 values(3,30,'2000-03-01','1900-01-01','2016-01-01');
insert into test1 values(4,40,'2000-04-01','1900-01-01','2016-01-01');

数据库: db2 test2

create table test2
(
    ID int,
    ID2 int
);

insert into test2 values(1,11);
insert into test2 values(2,22);
insert into test2 values(3,33);
insert into test2 values(4,44);

数据库: db2 test3

create table test3
(
    ID int,
    date date
);

insert into test3 values(1,'2000-01-01');
insert into test3 values(2,'2000-02-02');
insert into test3 values(3,'2000-03-03');
insert into test3 values(4,'2000-04-04');

注意:现在我正在执行union所有三个表的查询,但会遇到性能问题。 test2

中还有test3db1个表格
select nm,sum(x.avghrs)
from
(
select t1.nm, sum(hrs) as avghrs
from db2.test3 t3,
     db2.test2 t2,
     db1.test1 t1
where t1.id = t2.id
    t3.id = t2.id
group by t1.nm

union

select t1.nm, sum(hrs) as avghrs
from db1.test3 t3,
     db1.test2 t2,
     db1.test1 t1
where t1.id = t2.id
    t3.id = t2.id
group by t1.nm

union

select nm, 0 as avghrs
from test1
where dates between st_date and ed_date
) x

group by nm;

请告诉我是否需要修改?

2 个答案:

答案 0 :(得分:1)

我认为问题与驻留在不同数据库中的表的列之间的JOIN有关。您可以尝试以下方法:

1)镜像单个数据库中的表(复制模式和数据)

2)应用适当的索引(至少包含JOIN中使用的ID)

3)仅将查询更改为仅从镜像表中选择

另外,您是否需要为联合结果执行不同的操作?如果没有,UNION应替换为UNION ALL以避免隐式DISTINCT。

答案 1 :(得分:0)

当您不关心消除重复记录时,UNION ALL将比UNION表现更好,因为您避免了昂贵的不同排序操作。