我有两个数据库,即db1
和db2
。
数据库db1
包含1个表test1
,数据库db2
包含两个表test2
和test3
。
以下是包含一些演示记录的下表。
数据库: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
test3
,db1
个表格
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;
请告诉我是否需要修改?
答案 0 :(得分:1)
我认为问题与驻留在不同数据库中的表的列之间的JOIN有关。您可以尝试以下方法:
1)镜像单个数据库中的表(复制模式和数据)
2)应用适当的索引(至少包含JOIN中使用的ID)
3)仅将查询更改为仅从镜像表中选择
另外,您是否需要为联合结果执行不同的操作?如果没有,UNION应替换为UNION ALL以避免隐式DISTINCT。
答案 1 :(得分:0)
当您不关心消除重复记录时,UNION ALL将比UNION表现更好,因为您避免了昂贵的不同排序操作。