通过删除子选择来改进查询?

时间:2011-11-07 22:02:35

标签: sql-server sql-server-2005

我们使用日志表来推断应用程序中的相当多的信息。我厌倦了ORM运行查询所花了多长时间以及ORM完成任务所需的查询量。但是,在花了一些时间尝试自己编写TSQL后,我真的没有改进它想要换掉它吗?我可以就如何改进此查询获得一些建议。感谢。

使用MSSQL 2005。

查询:

select
    [Priority] = 
    case 
        when t0.jm_priority = 0 then 'Normal'
        when t0.jm_priority = 1 then 'High'
        when t0.jm_priority = 2 then 'Urgent'
    end,

    t0.JM_Label as [Job Name],
    t1.jt_name as [Job Type],

    (select top(1) x0.JL_Created from pub_joblog as x0
        where x0.js_jobstatusid = 1 and x0.jm_jobmasterid = t0.jm_jobmasterid
        order by jl_created asc) as [Received Date],

    t0.jm_duedate as [Job Due Date],
    t0.jm_cabduedate as [Job CRB Due Date],
    t3.displayname as [Job Host Site],

    (select top(1) x1.username from pub_joblog as x0
        inner join netinfo_users as x1 on x1.userid = x0.netinfo_userid
        where x0.js_jobstatusid = 1 and x0.jm_jobmasterid = t0.jm_jobmasterid
        order by jl_created asc) as [Author],

    t4.username as [Tech Writer],

    (select top(1) x1.JS_Description from pub_joblog as x0
        inner join pub_jobstatus as x1 on x1.js_jobstatusid = x0.js_jobstatusid
        where x0.jm_jobmasterid = t0.jm_jobmasterid
        order by jl_created desc) as [Job Status],

    (select top(1) x0.JL_Created from pub_joblog as x0
        where x0.js_jobstatusid = 9 and x0.jm_jobmasterid = t0.jm_jobmasterid
        order by jl_created desc) as [Completed Date],

    (select top(1) x0.JL_Created from pub_joblog as x0
        where x0.jm_jobmasterid = t0.jm_jobmasterid
        order by jl_created desc) as [Last Modified],

    (select top(1) x0.jl_notes from pub_joblog as x0
        where x0.jm_jobmasterid = t0.jm_jobmasterid
        order by jl_created desc) as [Last Job Comment] 

from  pub_jobmaster as t0
    inner join pub_jobtype as t1 on t1.jt_jobtypeid = t0.jt_jobtypeid
    left outer join pub_jobsitemap as t2 on t2.jm_jobmasterid = t0.jm_jobmasterid
    left outer join net_ou as t3 on t3.net_ouid = t2.net_ouid
    left outer join netinfo_users as t4 on t4.userid = t0.nu_techwriterid
where  (select top(1) z0.js_jobstatusid
            from pub_joblog as z0 
            where z0.jm_jobmasterid = t0.jm_jobmasterid
            order by z0.jl_created desc) <> 9 AND (select top(1) z0.js_jobstatusid
            from pub_joblog as z0 
            where z0.jm_jobmasterid = t0.jm_jobmasterid
            order by z0.jl_created desc) <> 16 
order by t0.jm_duedate

不确定如何/在何处发布执行计划,所以我只是将其上传到jsfiddle.net:http://jsfiddle.net/my52z/

可能不是预期的目的,但它确实有效。

1 个答案:

答案 0 :(得分:0)

我建议您发布表和索引结构。只需浏览代码,性能可能会受到结构的影响,而不是大量使用连接。以下是一些建议:

  1. 在WHERE子句中使用的不是键的列(PRIMARY / FOREIGN)上放置索引。 JOIN的ON子句中的那些应该是FOREIGN KEYS!
  2. 将查询转换为VIEW或存储过程:它将受益于存储的查询计划。
  3. 如果您阅读的频率高于写入表格,则结构的非规范化将提高性能。这不是将内容存储在不同的表中,而是在查询时通过外键连接它们,而是希望有一个包含其中所有列的宽表。您可以使用引用表来确保插入时的完整性。毕竟,写完后不会更新“日志”条目。