我更喜歡在t-sql中使用有效的內聯方式進行編碼,而不是在存儲過程或視圖末尾有一長串聯接。編碼內連接的兩種方法中的哪一種更快?
例如,我的代碼:
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
不是
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
我喜歡這種類型的語法,因爲它是如此混亂少得多寫或調試時,尤其是當有很多表被加入或其他東西正在進行(case語句,t-sql函數,自加入等)
但我的問題是 - 我正在通過查詢數據庫就這樣。
我還沒有收集足夠的數據來測量差異,但我會在某個時間點上路。
我想在進一步研究之前找出答案。我不想以後再回去重新編碼一切以提高性能。
+1。正如你指出的那樣,通過深思熟慮的索引獲得的勝利更有可能產生顯着的收益。 (但檢查執行計劃會讓他們知道!) – Beska 2009-07-08 20:07:59
+1「檢查自己的查詢執行計劃!」這是確定的唯一方法。優化器*可能會自動將它們變成JOIN。雖然,這兩個查詢不完全相同。 #1是一個LEFT JOIN,#2是一個INNER JOIN。所以他們會給你不同的計劃。 – beach 2009-07-08 20:10:11
這很容易讓人誤解 - 它是一個常見的誤解,即由於您給出的原因,子查詢比較慢,實際上SQL服務器在重新編譯過程中儘可能將子查詢重寫爲連接。 – Justin 2009-07-13 10:16:17