左连接导致头痛

时间:2013-08-29 16:20:33

标签: sql sql-server-2000

我正在对一个运行很长时间的进程进行故障排除。这个select statemet运行超过30分钟,当我注释掉它的各个部分时,它运行得非常快。我在表格旁边放了一个看起来引起问题的*,有两个的**在Empid和ChangeDate上有一个聚集索引(这些列不是彼此相邻的)不确定是否重要,也没有这些表有超过3000行。我希望有一些简单的调整帽需要制作。我在源表中应该看一下吗?任何建议,将不胜感激。我用谷歌搜索了“单一声明中的多个连接”,没有运气。出于故障排除的目的,我将with(nolock)放入。

select 
je.EmpID, 
max(med.ChangeDate) as Max_Medical_ChangeDate,  
max(den.ChangeDate) as Max_Dental_ChangeDate,
max(k.ChangeDate) as Max_401K_ChangeDate,
max(ltd.ChangeDate) as Max_LTD_ChangeDate,
max(std.ChangeDate) as Max_STD_ChangeDate,
max(life.ChangeDate) as Max_Life_ChangeDate,
max(sal.ChangeDate) as Max_Salary_ChangeDate,
max(ltdexe.ChangeDate) as Max_LTDEXE_ChangeDate
max(accid.ChangeDate) as Max_Accid_ChangeDate,
max(cancr.ChangeDate) as Max_Cancr_ChangeDate,
max(hosp.ChangeDate) as Max_Hosp_ChangeDate
from Judge_Emp je WITH(NOLOCK)
           left join Medical med on je.EmpID = med.EmpID 
           left join Dental den on med.EmpID = den.EmpID 
           left join R401K k on den.EmpID = k.EmpID 
           left join STDIns std on k.EmpID = std.EmpID 
           left join LTDIns ltd on std.EmpID = ltd.EmpID 
        *   left join LTDEXEIns ltdexe on ltd.EmpID = ltdexe.EmpID 
      **   left join LifeIns life on ltdexe.EmpID = life.EmpID 
        *  left join Salary sal on life.EmpID = sal.EmpID 
       left join AF_Accid accid on accid.EmpID=sal.EmpID
       left join AF_Cancr cancr on cancr.EmpID=accid.EmpID
       left join AF_Hosp hosp on hosp.EmpID=cancr.EmpID
group by je.EmpID

由于

1 个答案:

答案 0 :(得分:0)

评论太长了。

如果您使用的是left outer join,则您的连接条件应参考链中的第一个表。例如:

from Judge_Emp je WITH(NOLOCK)
           left join Medical med on je.EmpID = med.EmpID 
           left join Dental den on je.EmpID = den.EmpID 
           left join R401K k on je.EmpID = k.EmpID  . . .

而不是:

from Judge_Emp je WITH(NOLOCK)
           left join Medical med on je.EmpID = med.EmpID 
           left join Dental den on med.EmpID = den.EmpID 
           left join R401K k on den.EmpID = k.EmpID . . .

原因是med.EmptID可能是NULL,这会导致联接失败。 (它对内连接没有影响。)

但这可能不会影响查询的性能。我的猜测是,它们有多个匹配的行,并为每个客户生成笛卡尔积。