Και για ποιον λόγο να μην κάνεις join τους πίνακες που είναι πιο απλό;
Aν μεταφέρουμε τα queries στην Northwind, για παράδειγμα το πρώτο και το δεύτερο γίνονται:
SELECT od.* FROM [order details] od ,(SELECT OrderID FROM Orders) AS O WHERE od.OrderID = o.OrderID
SELECT od.* FROM [order details] od INNER JOIN Orders o
ON od.OrderID = o.OrderID
παράγουν το ίδιο execution plan όπως το
SELECT od.* FROM [order details] od INNER JOIN Orders o
ON od.OrderID = o.OrderID
Το query engine του SQL Server είναι απίθανο! Μία από τις φάσεις που περνάει το statement όταν πρόκειται να το εκτελέσει είναι το optimization. Ενδεχομένως σε κάποια άλλη database να παίζει ρόλο αν θα γράψεις το query με τον έναν ή τον άλλον τρόπο, αλλά στον SQL Server όλοι οι τρόποι οδηγούν στα joins ![Smile [:)]](/cs/emoticons/emotion-1.gif)
Άρα λοιπόν θα πρέπει να λύνεις κάποιο συγκεκριμένο πρόβλημα για να μην επιλέξεις joins, πχ να γράφεις cross db platform statements. Εσωτερικά τώρα, τα joins υλοποιούνται με διάφορους τρόπους από το query engine, ανάλογα με τα περιεχόμενα των πινάκων που γίνονται join. Ένας από τους τρόπους αυτούς είναι με χρήση hash tables - πολύ χοντρικά κάτι σαν virtual tables - αλλά ο τρόπος που θα επιλέξει τελικά να κάνει join εξαρτάται από τα ίδια τα περιεχόμενα τών πινάκων (τι indexes έχουν, αν είναι ταξινομημένα ή όχι, τι κατανομή έχουν οι τιμές, κλπ).
Παρεπιπτόντως, το query engine συνεχώς βελτιώνεται όχι μόνο από έκδοση σε έκδοση αλλά από SP σε SP. Η ομάδα του SQL Server σε συνεργασία με μεγάλους οργανισμούς που χρησιμοποιούν SQL Server, λαμβάνει δείγματα από πραγματικά δεδομένα και τα queries που χρησιμοποιούν και βελτιστοποιεί συνεχώς τον τρόπο που δουλεύει το engine!
Vir prudens non contra ventum mingit