2013-03-18 22 views
27

Aşağıdaki iki örneğim var.SQL JOIN WHERE koşulunun nereye yerleştirileceği?

1. Örnek (NEREDE)

SELECT 1 
    FROM table1 t1 
    JOIN table2 t2 ON t1.id = t2.id 
WHERE t2.field = true 

2. Örnek (JOIN VE)

SELECT 1 
    FROM table1 t1 
    JOIN table2 t2 ON t1.id = t2.id AND t2.field = true 

performans açısından daha hızlı yolu nedir? Ne tercih edersin? Normal koşullarda, filtre koşullarından bağımsız olarak,

cevap

16

Bir filtre JOIN koşulunda işlevsel olarak girerse (yani, yalnızca bir filtre değil, gerçek bir katılım koşulu), bu birleştirmenin ON maddesinde görünmelidir.

değer belirterek: Bunun yerine WHERE fıkrada yerine takdirde katılmak INNER ise

  • , performanslar aksi takdirde farklıdır, aynıdır. Yorumlarda belirtildiği gibi, sonuç neticede farklı değildir. gerçekten bir OUTER JOIN durum metotunun bu filtreler birinci orada mevcut olmalıdır kayıtları ima olarak durumun OUTER doğasını ("hiçbir kayıt olduğunda bile katıl") iptal olduğunda

  • WHERE fıkrada filtreyi Yerleştirme yer. Örnek: t2.column = 5 birleştirme dış tersine olarak beklenen t2'den kayıtları motoru söyler olarak

... table1 t LEFT JOIN table2 u ON ... AND t2.column = 5,

... table1 t LEFT JOIN table2 u ON ... 
WHERE t2.column = 5 

yanlış doğrudur. Bunun istisnası, bir IS NULL filtre olabilir, örneğin WHERE t2.column IS (NOT) NULL

  • LEFT ve RIGHT metotunun OUTER katılır olan birleşimler (şartlı dış oluşturmak için uygun bir yol aslında katılır).

Yardım edin.

+2

Bu yanıt yanlış yazılmış ve bir parça yazılmıştır. 1. INNER JOIN için herhangi bir koşul, araya giren OUTER JOIN olmadığı sürece ON yerine bir WHERE olabilir. 2. LEFT JOIN koşulunu ON'tan WHERE'ye taşıdığınızda, performans genel olarak sonuçtan farklı olduğu için, performansın önemi yoktur. 3. Bu fark genel olarak "DIŞ JOIN'i bir İÇERİK BİR BAĞLANTI 'ya dönüştürmez". – philipxy

+0

@philipxy haklısınız, biraz temizlemeye çalıştım – Sebas

+0

Ne '' bir filtrenin işlevsel olarak bir JOIN koşuluna girer '' veya '[bir filtre] gerçek bir birleştirme koşulu değil, sadece bir filtre' anlamına gelir? Her neyse 'sadece bir filtre' nosyonu faydalı değildir, çünkü 'c ve d' JOIN ON 'ifadesinin anlamı' JOIN ON WHERE d 'ile aynıdır. (Aslında, SQL standardı * JOIN WHERE cinsinden JOIN ON'u tanımlar.) Benzer şekilde "koşulun DIŞI niteliğini iptal eder" * sadece bir şey iletmez *. Hangi korkuyu tırnak içine aldığınızdan (ki bu da kendiliğinden belirsiz) ekliyorsunuz (“kayıt olmadığında bile katılın”). Açıklamıyorsun. – philipxy

5

JOIN koşullarına uyulmalıdır. Birleşiminizin kurallarını (nasıl) ON ile tanımlarsınız. numaralı telefonu numaralı telefonu WHERE ile filtrelersiniz. Performans bilge, tüm motorlarda ve tasarımlarda genel bir kural yoktur, bu nedenle kilometreniz büyük ölçüde değişecektir.

0

Filtrenin nereye konduğunu belirlemenin daha hızlı bir yol olduğunu düşünüyorum, çünkü ilk önce filtreyi, daha sonra birleştirme maddesini işleyecek, böylece filtrelerin permütasyonuna gerek olmayacaktır.

+0

Herhangi bir optimizasyon ile bir DBMS için hiçbir fark yoktur. Örneğin, SELECT/JOIN optimizasyonunda MySQL belgelerine bakın: INNER JOIN ON, bu JOIN'e bir WHERE uygulanmış gibi kabul edilir. – philipxy