Ich ziehe es vor, in t-sql mit dem Code zu codieren, der tatsächlich ein Inline-Join ist, anstatt eine lange Liste der Joins am Ende der Stored Procedure oder View zu haben.Welche der beiden Arten, einen Inner Join zu codieren, ist schneller?
Zum Beispiel habe ich Code:
SELECT PKey , Billable,
(SELECT LastName FROM Contact.dbo.Contacts WHERE (Pkey = Contacts_PKey)),
(SELECT Description FROM Common.dbo.LMain WHERE (PKey= DType)),
(SELECT TaskName FROM Common.dbo.LTask WHERE (PKey = TaskType)) ,
StartTime, EndTime, SavedTime
FROM dbo.TopicLog where StartTime > '7/9/09' ORDER BY StartTime
Statt
SELECT t.PKey, t.Billable, c.LastName, m.Description, lt.TaskName, t.StartTime, t.EndTime, t.SavedTime
FROM dbo.TopicLog AS t
inner join Contact.dbo.Contacts as c on c.Pkey = t.Contacts_PKey and t.StartTime > '7/9/09'
inner join Common.dbo.LMain as m on m.PKey = t.DType
inner join Common.dbo.LTask as lt on lt.PKey = t.TaskType
ORDER BY t.StartTime
ich diese Art von Syntax bevorzugen, weil es so viel weniger verwirrend ist, wenn oder Fehlersuche zu schreiben, vor allem, wenn es viele Tische verbunden sein oder andere Sachen, die weitergehen (Fallanweisungen, t-sql-Funktionen, Selbstverbindungen usw.)
Aber meine Frage ist - nehme ich eine Leistung, die durch das Abfragen der Datenbank getroffen wird se auf diese Weise.
Ich habe noch nicht genug Daten gesammelt, um einen Unterschied zu messen, aber ich werde irgendwann die Straße runter gehen.
Ich würde gerne herausfinden, bevor ich weiter fortfahren. Ich möchte nicht später zurückgehen und alles neu programmieren müssen, um die Leistung zu verbessern.
+1. Wie Sie unterstreichen, sind die Gewinne, die durch sorgfältige Indexierung erzielt werden, viel wahrscheinlicher, um signifikante Gewinne zu erzielen. (Aber die Überprüfung des Ausführungsplans wird sie sicher wissen!) – Beska
+1 "Überprüfen Sie die Abfrage Ausführungspläne für sich selbst!" Nur so kann man sicher sein. Der Optimierer * könnte sie * automatisch in JOINs verwandeln. Obwohl die zwei Abfragen nicht genau identisch sind. # 1 ist ein LINKER JOIN, # 2 ist ein INNERER JOIN. Also werden sie dir trotzdem andere Pläne geben. – beach
Dies ist ziemlich irreführend - es ist ein weit verbreiteter Irrtum, dass die Unterabfragen aus dem angegebenen Grund langsamer sind, wobei SQL Server tatsächlich Unterabfragen als Joins beschreibt, die bei der Neukompilierung ohnehin möglich sind. – Justin