2012-05-08 20 views
5

Tablodan ek bilgiler almak için hangi tablonun çekileceğine karar vermek için kullanılan "bayrak" olarak işlev gören bir sütun içeren bir tablom var. masa2'den, vb. Genellikle indeksleri/anahtarları kullanarak tabloya katılırdım. Ancak, katılabileceğim tablo, hangi tabloya katılacağına karar vermek için beni bir sütun kullanma durumundan ayıran ayrı tablolar halinde normalleştirilebilecek bilgiler içeriyordu.SQL Optimizasyonu - Sütun değerine bağlı olarak farklı tablolara katılın

İşte benim sorum şu; bu tablodaki değerlere göre farklı tabloları birleştirmenin en etkili yolu nedir?

Şu anda bu görevi nasıl gerçekleştireceğimi bilmenin iki yolu vardır.

  1. (katılmak için hangi tablo karar sütun değerini içeren) benim ana tablodan bilgi çekin ve sonra benim uygulamada koduyla ek sorgular gönderin: Ben onlar optimal çözüm hem eminim bilginin geri kalanını al.

  2. Git delice katılın, her tablonun sütunlarını döndürün (kullanılmasa bile). Ardından, kodum aracılığıyla, gerekli olmayan tabloların boş değerlerini dikkate almayın.

+2

Nasıl nokta 1 hakkında? Ancak, daha sonra uygulama kodu yerine saklı yordamına koyun. –

cevap

1

Kesinlikle 2. seçenek değil. Verilere ihtiyacınız yoksa onu almayın. Basit. Verilere ihtiyacınız olmadığında tablolara katılmak (özellikle büyük olanlar) inanılmaz derecede verimsiz olacaktır. Seçenek 1 ile devam edebilir veya sorguyu oluşturmak için dinamik SQL kullanabilirsiniz. Daha sonra bazı test senaryolarını bir araya getirip, sorgunuzun nasıl performans gösterdiğini görmek için yürütme planını çalıştırırdım.

1

Diğer tabloların içeriğine bağlı olarak, bir UNION öneririm - döndürülen sütunların her sorguda aynı olması gerekir.

SELECT table1.title, tabel2.text FROM table1 INNER JOIN table2 ON table1.id=table2.id WHERE table1.key='2' 
UNION 
SELECT table1.title, tabel3.text FROM table1 INNER JOIN table3 ON table1.id=table3.id WHERE table1.key='3' 

(bu şema ile eşleşen emin olmak için SQL Tweaking ve gerçekten de bölümünde eklediğiniz hatalardan kaçınmak için)

+0

Her tablo, hangi tabloyu kullanacağımı bildiğimde, tabloları birleştirmek için kullanacağım anahtarlar/dizinler dışında farklı sütunlar vardır. – user1110302

+0

Bu durumda, her tablo için birden çok sorgu yapmanız gerekeceğini düşünüyorum. Her tablonun satırlarını CAST yapmak mümkün olsa da hepsi aynı tipte mi? – andrewsi

+0

Not geçici tablolar ile onlar alt sorgularda/sendikada bir kereden fazla kullanılamaz mysql – tipu

1

Bunun mümkün olduğunu düşünüyorum:

Böylece gibi bir şey yapabilirsiniz
create table a (id integer, flag boolean); 
create table b (id integer, value_b varchar(30)); 
create table c (id integer, value_c varchar(30)); 

insert into a values (1, true), (2, false); 
insert into b values (1, 'Val 1'), (2, 'Val 2'); 
insert into c values (1, 'C 1'), (2, 'C 2'); 

select a.id, 
     case when a.flag then b.value_b else c.value_c end AS value 
    from a 
    left join b using (id) 
    left join c using (id); 

try it out.

orada Tabii

ediyoruz sınırlamaları: Bazı değerler ihmal gerekip gerekmediğini NULL s için gitmeli böylece sütunların

  • sayısı sabittir;
  • her sütun için bir CASE ... END yazmanız gerekir;
  • Birleştirilmiş tüm tabloları önceden bilmelisiniz;
  • performansı en iyi olmayabilir.
+0

Yanıt için teşekkürler, ama bu kesinlikle benim durumum için çalışmayacak.Bu durumda, sütunlar her tabloda farklı olacak ve diğerlerinden bahsedildiği gibi, diğer tablolara katılmadan ve bilginin bir kısmının kullanılmamasından hemen sonra performansı yok edecektir. – user1110302

İlgili konular