视图的sql如下:
Select 
B.Sex,B.MobilePhone,
AR.InterviewLocation,AR.TargetLocation,
(Case 
When (C.HRInterviewLocation is null) then AR.InterviewLocation
else C.HRInterviewLocation
end
) as ArrangeInterviewLocation,
(CASE WHEN CF.ClassID IS NULL THEN -1 ELSE CF.ClassID END) AS ClassID,
(CASE WHEN CD.Name IS NULL THEN '未读' ELSE CD.Name END) AS ClassName,
E.DiplomaTypeID,E.Diploma,E.School,E.Major,
(Case C.ResumeType 
When 0 then '标准型'
When 1 then '附件型'
end
) as ResumeTypeName,
C.* 
from 
Intranet..Hr_Candidate as C left join
Intranet..Hr_Candidate_Base as B on C.ID=B.CandidateID left join
Intranet..Hr_Candidate_ApplyReason as AR on C.ID = AR.CandidateID left join 
Intranet..Hr_Candidate_Classify as CF on C.ID = CF.CandidateID left join
Intranet..Hr_Candidate_ClassDefine as CD on CF.ClassID = CD.ID left join
(
Select B.Type as Diploma,A.* from 
Intranet..Hr_Candidate_Education as A left join
Intranet..Hr_Candidate_DiplomaType as B on A.DiplomaTypeID = B.ID Inner Join
(
Select A.CandidateID,Max(A.ID) as ID from 
Intranet..Hr_Candidate_Education as A left join
Intranet..Hr_Candidate_DiplomaType as B on A.DiplomaTypeID = B.ID Inner Join
(
Select CandidateID,Max(B.SortOrder) as SortOrder 
from 
Intranet..Hr_Candidate_Education as A left join
Intranet..Hr_Candidate_DiplomaType as B on A.DiplomaTypeID = B.ID
group by A.CandidateID
) as C
on A.CandidateID = C.CandidateID and B.SortOrder = C.SortOrder
group by A.CandidateID
) as C on A.ID = C.ID
) as E on C.ID = E.CandidateID当对 interviewLocation 和 ClassID 进行查询时,超时。记录条数2309. 应该是小小小表了。
试过索引,但是还是很慢,希望高手能指点迷津。
谢谢大家

解决方案 »

  1.   

    view不是表。 你可以建 index view 但是维护代价很高。
    对你的表结构,数据量,index都不清楚,没办法判断。
    从逻辑上想办法吧,用其他方法,view不是万能的。
      

  2.   

    要优化SQL结构了,这里只提供思路:
    1.内表嵌套层数太多.
    2.尽量不要用子表,如果一定要用,请用相关子查询,这样可以先过滤掉一些不必要的行.
    3.left join是否能够优化.
    4.添加index.
      

  3.   

    把index建好,
    只是一些表连接,
    如果要优化,要看你要的视图查询结果了..
      

  4.   

    index使用过,对效率提高不大。
    想请问一下对数据库查询的层次有什么教程可以学习一下。
    暂时没有解决。还是超时,我估计还是嵌套太复杂,但是不嵌套又不行,苦恼啊。