T-SQL中的优化查询

时间:2015-09-18 04:43:50

标签: sql sql-server-2008 tsql

如果您正在为任何政府部门开发任何软件解决方案,这通常会遇到问题。因此,请将此视为需要解决的关键问题。

了解方案 每个政府都作为部门,不同城市的部门和每个部门负责满足公民服务的需要。例如,Industry Commiserate。如果您想为某些产品建立新的制造单位,您应该向政府部门申请,官员进行审查和其他必要的验证过程。最后决定你是否有资格建立一个单位。

满足要求 为了满足上述要求,我们创建了数据库...我不打算在此处包含所有内容,只包含所需的表格。 1. GovtOfficers:政府官员详细说明有字段

enter image description here

DeptOfficers:包含部门主管, 公民是像我们这样提交申请的人, 应用程序:是公民提交的申请 ApplicationAction:是对不同的应用程序采取的行动......

现在,我们的目的是找到针对特定应用程序工作的最后状态和主管名称......

我们会把它写成,

Select *
from Applications A
inner join Citizens C on A.CitizenId=C.Id
left join ApplicationAction AC on A.Id=AC.ApplicationId
left join
(
    Select max(Id)
    from ApplicationAction
    group by ApplicationId
) X on AC.Id=X.Id

以上查询获取所需的结果并且工作正常....但是当数据输出增长到10-20缺乏时,它不会开始花费时间并最终可能会超时。

什么是更好的方法? 好的,根据获得的经验,我可以在Application Table中添加ActionId,它将存储在该表上采取的最新操作....并且可以解决我的问题。 问题是,我可以为即将开展的项目使用上述解决方案..不是我已完成的项目或我没有合同。

所以我不是在寻找架构更改以优化上述查询。

1 个答案:

答案 0 :(得分:1)

将null应用程序分开

select * from 
(   Select *, 
           row_number() over(partition by AC.ApplicationId order by AC.id desc) as rn 
      from Applications A
      join Citizens C 
            on A.CitizenId = C.Id
      join ApplicationAction AC 
            on A.Id = AC.ApplicationId
) ttt
where ttt.rn = 1