Bei inneren Joins habe ich keinen wirklichen Unterschied festgestellt (aber wie bei jeder Leistungsoptimierung müssen Sie Ihre Datenbank unter Ihren Bedingungen überprüfen).
Allerdings macht es einen großen Unterschied, wo Sie die Bedingung setzen, wenn Sie linke oder rechte Verbindungen verwenden. Betrachten Sie zum Beispiel diese beiden Abfragen:
SELECT *
FROM dbo.Customers AS CUS
LEFT JOIN dbo.Orders AS ORD
ON CUS.CustomerID = ORD.CustomerID
WHERE ORD.OrderDate >'20090515'
SELECT *
FROM dbo.Customers AS CUS
LEFT JOIN dbo.Orders AS ORD
ON CUS.CustomerID = ORD.CustomerID
AND ORD.OrderDate >'20090515'
Mit der ersten erhalten Sie nur die Datensätze, deren Bestellung nach dem 15. Mai 2009 datiert ist, wodurch die linke Verknüpfung in eine innere Verknüpfung umgewandelt wird.
Der zweite Datensatz enthält diese Datensätze sowie alle Kunden, die keine Bestellungen haben. Die Ergebnismenge ist sehr unterschiedlich, je nachdem, wo Sie die Bedingung setzen. (Select * dient nur als Beispiel, Sie sollten dies natürlich nicht im Produktionscode verwenden).
Die Ausnahme ist, wenn Sie nur die Datensätze in einer Tabelle sehen wollen, aber nicht in der anderen. Dann verwenden Sie die Where-Klausel für die Bedingung und nicht die Verknüpfung.
SELECT *
FROM dbo.Customers AS CUS
LEFT JOIN dbo.Orders AS ORD
ON CUS.CustomerID = ORD.CustomerID
WHERE ORD.OrderID is null