内连接vs存储过程或函数sql server

时间:2014-08-01 20:47:56

标签: sql stored-procedures inner-join sql-function

我有这个架构:

enter image description here

如果我想显示Attend表格,而不是DoctorIdPatientId,则会显示员工姓名和患者姓名。

像这样:

  • ID
  • 患者姓名
  • 医生姓名[==员工姓名]
  • 开始
  • 结束

第一种方法是使用内连接:

select 
   a.Id, p.Name, a.Name, a.Start, a.End 
from 
   Patient as p  
inner join 
   (select 
       e.Name, at.Id, at.Start, at.End, at.PatientId
    from 
       Attend as at  
    INNER JOIN 
       Employee as e on at.DoctorId = e.Id) as a on p.Id = a.PatientId

第二种方法是使用函数或存储过程 - 发送id并返回名称

 select 
    a.Id, 
    FindDoctor(a.DoctorId) as Doctor, 
    FindPatient(a.PatientId) as Patient, 
    a.Start, a.EndTime 
 from  
    Attend AS a

哪个更好?哪种是优化方法?

1 个答案:

答案 0 :(得分:5)

通常,SQL引擎在优化查询方面比优化函数调用做得更好。我建议你坚持使用查询,至少在开始时。这也使我们更容易理解可能出现的性能问题。

顺便说一句,不需要子查询来做你想做的事情。 SQL Server非常智能,因此它可能不会影响性能。但是,您可以将查询编写为:

select at.Id , p.Name , e.Name , at.Start, at.End 
from Patient p inner join 
     Attend at
     on p.Id = at.PatientId inner join
     Employee as e
     on at.DoctorId = e.Id;

有些人喜欢在存储过程中嵌入此类查询。如果你想封装这个逻辑,我会建议使用视图或表值函数。