2016-04-05 18 views
0

Basit bir SELECT sorgusu oluşturmanın daha uygun maliyetli yolu hangisidir. Birinci seçenek:Basit SELECT sorgusunun çoklu NOT IN değerleriyle en iyileştirilmesi

SELECT id 
FROM table 
WHERE COL0 NOT IN (2,3,4,5,6,7,8,9...) 
    AND COL1 >= 20 
    AND COL2 <= 10 
    AND .... ; 

Veya seçenek iki:

SELECT id FROM table WHERE COL0 NOT IN (2,3,4,5,6,7,8,9...); 

col0 FK sütundur.

Gerekli olan ilk şey, COL0 üzerinde dizin olabilir. Ama oradan ..

  1. NOT IN yan tümcesinde bulunan numara örneğin 1'den 1000'e kadar olabilir.

Sorular: WHERE yan tümcesinde

  1. misiniz ek değerler yanıt olarak olmamalıdır şeyler ortadan kaldırarak daha hızlı sorgu gerçekleştirmek için DB yardımcı yoksa sadece kontrol için ek çalışma olacak ek değerlere uygun mu?
  2. Teorik olarak NOT IN deyiminde yüzlerce ID değerine sahip olmak, kötü ve "pahalı" tasarım olarak kabul edilir?

Firebird 2.5 kullanıyorum.

+0

bu değeri kurtarabilir? Sorgu planları neye benziyordu? –

+0

Üzgünüz, henüz yorum yok, henüz yorum yapma iznim yok. Sorum şu, ne yapmaya çalışıyorsun? Tek kullanım için mi yoksa sürekli olarak kullanılacak bir şey mi? –

+0

Amaç, "geçerli veri kümesinde" bulunmayan tüm ID'leri sorgulamak ve "etkin olmayan" bir satır eklemek için DB'de kaydedilen verileri değil, "geçerli veri kümesinde" (java nesneleri) bulunmayan verileri karşılaştırmaktır. Her kimlik için soruda işaretli sorgudan var. – Novice

cevap

2

Db sorgu eniyileyicisi, en fazla sayıda satırı filtrelemek için en iyi dizini kullanır.

yüzden hayal her ikisi (col0, col1, col2) için

  • col0, col1 için ayrı bir dizin ve col2
  • bileşik endeks:

    Yani ilk yaklasimimizi kullanmak ve ya eklemek gerekir 1000 satırınız var, ancak sadece 10 tane > 20 en iyileştirici col1 endeksini kullanarak 990 satırı filtreleyip filtrenin geri kalanını daha hızlı bir şekilde filtreleyebilirsiniz. Ayrıca yerine kullanım

    NOT IN size her şekilde test edildiğinde ne oldu ayrılmış masaya tblFilter

    SELECT id 
    FROM table T1 
    LEFT JOIN tblFilter T2 
         ON T2.col0 = T2.col0 
    WHERE T2.col0 IS NULL 
    
+0

Ya da bazı geçici masa ve dış birleştirme çözümü daha anlamlı olur mu? – Novice

+0

Mümkün, ancak test etmeniz gerekiyor. Tümü, tablo boyutuna ve her bir değerin kaç kez görüneceğini ve dizininizi nasıl ayarlayacağınıza bağlıdır. –

+0

Teşekkürler çocuklar :) İndeksler ile başlayacağım ve gerekirse IN, temp tablo şey denemek için yapacağız :) – Novice

İlgili konular