帮忙优化一个Sql,在线等、急急急!!!

NotFindObject 2016-09-23 10:59:04
表结构是 LetInLandPeople 人员信息表
DoorLog 操作记录表
DoorLimits 权限信息表
现在是要查询出每个人的权限有效期剩余天数,跟最后刷卡日期距离当前天数,这两个还要作为筛选条件
下面是原始SQL 正在努力优化中。。 奈何技术有限 求救!!!
select * from (

select ROW_NUMBER() over(order by ID) RowNumber,* from (

select
lp.Xm,lp.ID,lp.DeptID,tt.OprationTime,ValidTime,
DATEDIFF(DD,GETDATE(),ValidTime) ValidDays,
ISNULL(convert(varchar(10),DATEDIFF(DD,tt.OprationTime,GETDATE())),-1) SoltDays,
com.DeptName+' '+lp.Gzdw DZ,lp.Lxdh
from LetInLandPeople lp
left join(
select MAX(dl.OprationTime) OprationTime, Max(ValidTime) ValidTime,lp.ID from LetInLandPeople lp
join DoorLog dl on lp.ID=dl.PID
left join DoorLimits dls on dls.PID=lp.ID
where lp.Rzzt = 1
group by lp.ID) tt on tt.ID=lp.ID
join ComDepartment com on com.ID=lp.DeptID
where lp.Rzzt = 1
and DeptID in (select ID from dbo.GetDeptIDsByPID(2))

)aa
--where ValidDays between 7 and 30
--and SoltDays between 7 and 30
) cc
--where cc.RowNumber between 1 and 20


...全文
134 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
中国风 2016-09-23
  • 打赏
  • 举报
回复
在条件列加上索引,用以下语句测测 另外看执行计划,你的函数占用的资源百分比,占用高就贴出来看看能否优化
--select * from (

SELECT  ROW_NUMBER() OVER ( ORDER BY ID ) RowNumber ,
        *
FROM    ( SELECT    lp.Xm ,
                    lp.ID ,
                    lp.DeptID ,
                    tt1.OprationTime ,
                    tt2.ValidTime ,
                    DATEDIFF(DD, GETDATE(), tt2.ValidTime) ValidDays ,
                    ISNULL(CONVERT(VARCHAR(10), DATEDIFF(DD, tt1.OprationTime,
                                                         GETDATE())), -1) SoltDays ,
                    com.DeptName + ' ' + lp.Gzdw DZ ,
                    lp.Lxdh
          FROM      LetInLandPeople lp
                    CROSS APPLY ( SELECT    MAX(dl.OprationTime) OprationTime
                                  FROM      DoorLog dl
                                  WHERE     dl.PID = lp.ID
                                ) tt1
                    CROSS APPLY ( SELECT    MAX(ValidTime) ValidTime
                                  FROM      DoorLimits dls
                                  WHERE     dls.PID = lp.ID
                                ) tt2
                    JOIN ComDepartment com ON com.ID = lp.DeptID
          WHERE     lp.Rzzt = 1
                    AND DeptID IN ( SELECT  ID
                                    FROM    dbo.GetDeptIDsByPID(2) )
        ) aa;

NotFindObject 2016-09-23
  • 打赏
  • 举报
回复
感谢大神解我燃眉之急。。。在此祝大神仙福永享、寿与天齐!!!!!

34,594

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧