我更喜欢在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