2010-03-22 16 views
6

Tüm hanehalklarına emirlerle bakmalıyım. Siparişin verisini hiç umursamıyorum, sadece var.İkinci tablodan herhangi bir veriye ihtiyaç duyulmadığında JOIN daha fazla/daha az verimli mı?

SELECT HouseholdID, LastName, FirstName, Phone 
FROM Households 
INNER JOIN Orders ON Orders.HouseholdID = Households.HouseholdID 

veya bu:

SELECT HouseholdID, LastName, FirstName, Phone 
FROM Households 
WHERE EXISTS 
    (SELECT HouseholdID 
    FROM Orders 
    WHERE Orders.HouseholdID = Households.HouseholdID) 
+0

(Oracle, SQL Server, MySQL, SQLite :-) kullandığınız Ne DB:

bu makaleye bakın? – lexu

+0

Oops! Düzenlenen soruyu içerecek şekilde düzenlenmiş - SQL Server – twpc

cevap

3

2 sorgu eşdeğer değildir. Birden fazla birleştirme kaydı varsa, ilki birden çok sonuç döndürecektir. EXISTS, özellikle de optimizatörün kullanabileceği güvenilir bir FK kısıtlaması yoksa daha verimli olacaktır. bu oldukça sert 1'dir sürece bu son noktada daha fazla ayrıntı için

burada http://www.simple-talk.com/sql/t-sql-programming/13-things-you-should-know-about-statistics-and-the-query-optimizer/

+0

bağlantılı makale SQL Server içindir, bu tüm veritabanlarına uygulanmaz. Benim cevabımda söylediğim gibi bu sizin veritabanınıza bağlıdır, ancak SQL Server EXISTS'i birleştirmeden daha iyi optimize eder. –

2

veritabanı motoru bağlıdır ve ne kadar etkili o sorguları optimize olan

daha verimli böyle bir şey söylemek mi (SQL Server kullanarak). İyi bir olgun veritabanı optimizer EXISTS daha hızlı yapacak, diğerleri olmayacak. SQL Server'ın sorguyu daha hızlı yapabileceğini biliyorum, başkalarından emin değilim.

0

Böylesine önemsiz bir sorgu için, her iki varyantın yürütülmesi tek bir forma kadar kaynatılırsa, bu sistem tarafından en fazla performans gösterecekse, sürpriz olmaz. Öğrenmek için sorgu yürütme planına göz atın.

4

noktası 9 bkz: (hane ve siparişlerin daha geniş bir anlam verilmiş pek mantıklı görünmüyor) 1 ilişki Sorgularınız farklı sonuçlar verecektir (Siparişler tablosunda daha fazla eşleşen satır varsa).

Oracle'da (ve çoğu DBMS'de), Varolanların sürümünün yalnızca hak kazanmak için Hane rekortları siparişlerinde bir satır bulması gerektiğinden çok daha hızlı çalışmasını beklerim.

DBMS'den bağımsız olarak, açıklamanın plandaki farkı göstermesini beklerim (tablolar, tablonun tam tablo taramasıyla çözülmeyecek kadar büyük olması durumunda).

Denemeyi denediniz mi? Önbelleğe almayı mı sağlıyorsunuz?

C Postgres'e olarak

0

, iç birleştirme daha hızlı olacaktır bulunmaktadır.

1

Daha önce söylendiği gibi, en az bir evin birden fazla siparişi varsa, sorgularınız farklı sonuçlar getirecektir.

DISTINCT'u kullanarak bu konuda çalışabilirsiniz, ancak EXISTS (veya IN) daha verimli olabilir.

İlgili konular