2016-04-14 23 views
1

Satırların miktarında bir fark olduğunu görebiliyorum ama hala bunun için & hesabını anlayamıyorum.Teradata SQL ayarlaması. Birden fazla sol dış birleştirmeyi yeniden yazma

sel a.15 ,b.16 , c.17, d.18 from 
    a LOJ b on (a.1=b.1 and a.2=b.2 and a.3=b.3 and a.4=b.4 and a.5=b.5) 
    LOJ c on (a.1=c.1 and a.2=c.2 and a.3=c.3 and a.4=c.4 and a.5=c.5) 
    LOJ d on (a.6=d.6 and a.7=d.7 and a.3=d.3 and a.4=d.4) 
    group by 1,2,3,4 

Tablo aa bir milyar + satır özellik tablosu ve PI tuşları hiçbir yerde katılmak fakat katılır ve çok d bazı PI tuşları içinde b ve c's PI anahtar yok üzerinde katılıyor olduğunu. Ben küçük satır sayısı farkı görmek 1/4 Darbe işlemci ve>% 50 makara kapalı ama - Yukarıdaki sorgu bir ton daha hızlı çalışır

select < same keys > 
    from a LOJ (select <keylist here> from 
       b JOIN c 
       on 
       (b.1=c.1 and b2.=c.2 and b3=c.3 and b4=c.4 and b.5=c.5) 
       JOIN d 
       on (b.3=d.3 and and b.4=d.4) 
       ) e 
       on 
       (e.1=a.1 and e.2=a.2 and e.3=a.3 and e.4=a.4 
       and e.5=a.5 and e.6=a.6 and a.7=e.7) 
       group by <col list> 
    /*DT e created that joins b c and d.Though I joined on 3 and 4 before 
    with b and d I took them again in the derived table e 
    and used them again to improve query efficiency */ 

olarak Yani yeniden yazdım. Yani mantığım a, bu tablolarla birlikte b,c,d LOJ idi. Yeniden yazma işlemi a'u sadece 1 tek masayı LOJ ile b,c,d (bir 'kaynaşmış tablo') ile birleştirecektir. Ayrı ayrı LOJ ise veya tek bir tabloya katılırsa, a'un önemi nedir? Ama öyle - Satırları kaybediyorum ve nasıl olduğunu anlamak istiyorum. Anladığım kadarıyla IJ'ler bu şekilde yeniden yazılabilir ancak LOJ'ler aynı değildir. Sayımda (*) KÜÇÜK bir fark vardır - yaklaşık 15 satır/milyon. Peki benim soru, 2. sorguya ne gibi değişiklikler ekleyeceğim, böylece bu 15 satır (delta) da dahil edilebilir ve sorgular eşdeğerdir.
Bunu tekrar gördükten sonra düşüncelerden sonra .. Nasıl farklı sonuçlar verebileceğimi anlıyorum (çünkü ben a'u ayrı ayrı üç basamaklıyorum) ama Soru 1'e eşdeğer olması için 2'ye ne eklemem gerekiyordu.

cevap

1

İki sorgunuz aynı değil.

İlk sorguya bir göz atın. İçinde, başlangıçta b tüm kayıtları birleştirir. Bu aynı zamanda, sol birleştirmeden dolayı b'de bulunmasa bile, tüm kayıtları a verir. Bu sonuç kümesi daha sonra c ile birleştirildi. Yine 'a' içindeki tüm kayıtlar alınır. Aynı şey d ve a arasındaki birleşmeye gidiyor. Burada, b, c ve d birbirinden bağımsızdır. Ancak, ikinci sorgunuzda, b ile c arasında iç birleşmeler gerçekleştirirsiniz. Bu, yalnızca numaralı anahtarlarda yalnızca b numaralı satırların bulunduğu ve c'nin getirildiği satırlar anlamına gelir. Yine bu sonuç kümesi, d ile birleştirilen INNER, birkaç kayıt kaybıyla sonuçlanır. Bu, bir ile katılmayı bıraktığınız son üründür. Kayıtlar alt seçimin kendisinde kaybolur.

Şu an küçük bir fark gözlemliyorsunuz, çünkü kayıtların çoğu iç katılım sırasında eşleşmelerine sahip olabilir. Bununla birlikte, optimizasyonunuz orijinal yaklaşımdan uzaklaşır.

+0

Evet A, ikinci dış sorguda olduğu gibi ilk dış sol birleştirmede. İkinci sorguda, – user1874594

+0

kompozit kablosunun dış birleşimlerini bıraktım, ikinci Q, 1. – user1874594

+2

@ user1874594'e eşdeğer hale getirmek için 2. Q'ya ekleyebileceğim değişiklikler oldu: Q2 ile aynı sonucu elde etmek için Q2'yi değiştiremezsiniz (ve hatta Inner birleşmesi için, yeniden yazmanız aynı sonucu döndürmeyebilir) – dnoeth

İlgili konular