更高效的大桌左连接

时间:2010-05-04 15:18:17

标签: sql sql-server-2005

我有以下(简化)查询

select P.peopleID, P.peopleName, ED.DataNumber
from peopleTable P
    left outer join (   
        select PE.peopleID, PE.DataNumber 
        from formElements FE
             inner join peopleExtra PE on PE.ElementID = FE.FormElementID 
        where FE.FormComponentID = 42
    ) ED on ED.peopleID = P.peopleID

如果没有子查询,这个过程需要大约7秒,但是使用它需要大约3分钟。

鉴于表peopleExtra相当大,是否有更有效的方法来加入(没有重组数据库)?

更多详情:

子查询的内部部分,例如

  select PE.peopleID, PE.DataNumber 
        from formElements FE
             inner join peopleExtra PE on PE.ElementID = FE.FormElementID 
        where FE.FormComponentID = 42

执行< 1到5秒之间,返回95k行

peopleTable中有1500个条目。

3 个答案:

答案 0 :(得分:2)

您的查询没问题,只需创建以下索引:

PeopleExtra (PeopleID) INCLUDE (DataNumber, ElementID)
FormElements (FormComponentID, FormElementID)

不需要重写连接(SQL Server的优化器可以很好地处理嵌套查询),但它可以使您的查询更具人性化。

答案 1 :(得分:1)

该子查询需要多长时间才能运行?如果它需要接近3分钟,那么你需要使子查询更有效 - 如果它只需要几秒钟,那么它就是需要处理的整个语句。

peopleExtra上有任何索引吗?具体来说,那就是从ElementID开始并包含DataNumber?我怀疑问题是子查询中的连接导致了问题。

另外,您能否提供一个查询计划?在查询之前运行SET SHOWPLAN_TEXT ON,然后在此处发布结果 - 这将有助于确定哪些因素会降低速度。

答案 2 :(得分:1)

对表而不是子查询进行连接,这应该为查询预处理器提供更好的自由来进行最佳连接。

select p.peopleID, p.peopleName, pe.DataNumber
from peopleTable p
left join (
  formElements fe
  inner join peopleExtra pe on pe.ElementID = fe.FormElementID
) on pe.peopleID = p.peopleID
where fe.FormComponentID = 42