2016-03-30 21 views
0

db1 ve db2 gibi iki veritabanım var.SQL Server 2008 R2: Farklı veritabanlarındaki tablodaki çoklu UNION

veritabanı db1 yani test1 ve veritabanı db2 iki tablo yani test2 ve test3 içeren 1 tablo içerir.

Bazı demo kayıtları aşağıdaki tabloda yer almaktadır.

Veritabanı: db1 Tablo: 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'); 

Veritabanı:db2 Tablo: 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); 

Veritabanı:db2 Tablo: 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'); 

Not: Şimdi ben union her üç tablo en aşağıdaki sorgu yürütülürken ama performans sorunu alıyorum. test2, test3 tabloları da 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; 

mevcut vardır vardır modifikasyon herhangi bir ihtiyaç varsa söyle?

+1

[Yürütme planı] 'nın ekran görüntüsünü ekleyebilirsiniz (http://stackoverflow.com/questions/7359702/how-do-i-obtain-a-query-execution-plan)? – zedfoxus

+0

@vkp, üzgünüm! Benim hatam. – MAK

+0

, "sendika" da 1 ve 2 sorguları aynı değil? –

cevap

1

Sorun, farklı veritabanlarında bulunan tablolardaki sütunlar arasındaki JOIN'lerle ilgili olduğunu düşünüyorum.

1) tek veritabanında tablolar ayna (çoğaltmak şema ve veri)

2), en az kullanılan kimlikleri içerecek şekilde JOIN (Uygun bir dizin uygulanır)

3: Aşağıdaki deneyebilirsiniz) Sorguyu yalnızca yansıtılmış tablolardan SELECT olarak değiştirin.

Ayrıca, birleştirilmiş sonuçlarınız için ayrı bir performans göstermeniz gerekiyor mu? Aksi takdirde, örtülü DISTINCT'yi önlemek için UNION ALL ile UNION değiştirilmelidir.

0

UNION TÜMÜ, farklı bir sıralama işleminden kaçınmanız nedeniyle yinelenen kayıtların kaldırılmasıyla ilgili endişeleriniz olmadığında, UNION'tan daha iyi performans gösterecektir.