Ποιο από αυτά τα ερωτήματα είναι το ταχύτερο;
ΔΕΝ ΥΠΑΡΧΕΙ:
SELECT ProductID, ProductName
FROM Northwind..Products p
WHERE NOT EXISTS (
SELECT 1
FROM Northwind..[Order Details] od
WHERE p.ProductId = od.ProductId)
Ή NOT IN:
SELECT ProductID, ProductName
FROM Northwind..Products p
WHERE p.ProductID NOT IN (
SELECT ProductID
FROM Northwind..[Order Details])
Το σχέδιο εκτέλεσης του ερωτήματος λέει ότι και οι δύο κάνουν το ίδιο πράγμα. Εάν ισχύει αυτό, ποια είναι η συνιστώμενη μορφή;
Αυτό βασίζεται στη βάση δεδομένων της NorthWind.
[Επεξεργασία]
Μόλις βρήκα αυτό το χρήσιμο άρθρο: http://weblogs.sqlteam.com/mladenp/archive/2007/05/18/60210.aspx
Νομίζω ότι θα παραμείνω στο NOT EXISTS.
Αν ο σχεδιαστής εκτέλεσης λέει ότι είναι το ίδιο, είναι το ίδιο. Χρησιμοποιήστε όποιο από τα δύο θα κάνει την πρόθεσή σας πιο προφανή -- σε αυτή την περίπτωση, το δεύτερο.
Στην πραγματικότητα, πιστεύω ότι αυτό θα ήταν το ταχύτερο:
SELECT ProductID, ProductName
FROM Northwind..Products p
outer join Northwind..[Order Details] od on p.ProductId = od.ProductId)
WHERE od.ProductId is null
Εξαρτάται..
SELECT x.col
FROM big_table x
WHERE x.key IN( SELECT key FROM really_big_table );
δεν θα ήταν σχετικά αργή η είναι't πολύ για να περιορίσει το μέγεθος του τι το ερώτημα ελέγχου για να δούμε αν είναι κλειδί είναι σε. Το EXISTS θα ήταν προτιμότερο σε αυτή την περίπτωση.
Αλλά, ανάλογα με το DBMS's optimizer, αυτό δεν θα μπορούσε να είναι διαφορετικό.
Ως παράδειγμα για το πότε είναι καλύτερο το EXISTS
SELECT x.col
FROM big_table x
WHERE EXISTS( SELECT key FROM really_big_table WHERE key = x.key);
AND id = very_limiting_criteria