我有以下(简化)查询
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个条目。
答案 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