如何优化此查询?

时间:2015-06-23 13:20:33

标签: sql sql-server database

在性能调优查询方面需要帮助。执行计划显示SResourceHierarchy和grouprelationship上的扫描计数太高  数百万左右的桌子。 我创建了关于sresource和矩阵目标的覆盖索引,主要减少了时间。 但我想知道是否有任何其他方式编写查询来提高整体性能,即使是1%。

query ::

select * from
(SELECT 
sr.rsrcnum, sr.fllnm, isnull(mgr.fllnm,'') as mgrnm, d.actid, d.goaldesctxt ,
    d.cmpltstscd, d.strtdt, d.enddt, dta,
    (select TOP 1 itmtxt from tm.Code where catcd = '12103' and itmcd = d.cmpltstscd and lngcd = 0 and delflg = 0) as Status


from
    TM.matrixgoal d
inner join
    TM.sresource sr on d.rsrcid=sr.rsrcid and sr.delflg=0 and sr.stscd<>1 and sr.rsrcid > 7
left join
    TM.sresource mgr on mgr.rsrcid=sr.mgr1id and mgr.delflg=0 and mgr.stscd<>1
inner join
    TM.resume1 r1 on r1.rsrcid=sr.rsrcid
where
    d.stscd in (3,4) and d.typcd=5009  and d.activeflg=1

        AND (sr.rsrcid IN (SELECT node.empid FROM tm.SResourceHierarchy node JOIN tm.SResourceHierarchy parent ON node.lft > parent.lft AND node.lft < parent.rgt AND node.mgrnum = 1 AND parent.mgrnum = 1  )
or sr.RsrcID IN (select r.rsrcid from tm.resume1 r join tm.grouprelationship g on
  (g.hierarchylvl0 = r.hierarchylvl0 or (g.hierarchylvl0 is null and r.hierarchylvl0 is null))
                and (g.hierarchylvl1=r.HierarchyLvl1 or (g.hierarchylvl1 is null and r.HierarchyLvl1 is null))
                and (g.hierarchylvl2=r.HierarchyLvl2 or (g.hierarchylvl2 is null and r.HierarchyLvl2 is null))
                and (g.hierarchylvl3=r.HierarchyLvl3 or (g.hierarchylvl3 is null and r.HierarchyLvl3 is null))
                and  g.delflg=0 and g.AllowDenyCD='a'))
) temp

ORDER BY
    fllnm, goaldesctxt

3 个答案:

答案 0 :(得分:1)

应该在查询中使用子查询。所以它应该是表现明智的穷人。 对每个主查询行运行简单的子查询。这花了很多时间。 如果提高性能,请避免子查询。您使用连接而不是子查询。

答案 1 :(得分:0)

对我而言,它看起来像是一个大屁股单行声明,我知道的唯一一个选择是尝试为您正在使用的各种表添加索引。这应该加快它更快地找到数据的能力

答案 2 :(得分:0)

尝试使用EXISTS代替IN