2011-11-07 31 views
0

我们使用日志表来推断我们应用程序中的相当多信息。我厌倦了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/

大概不会预期的目的,但它的作品。

+0

请张贴执行计划...,可以显示例如任何需要的索引和/或指出的斑点优化等 – Yahia

+0

@Yahia公布执行计划 –

回答

0

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

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

我真的不关心性能不亚于我关心基本面。我无法想象这是做查询的好方法。我正在寻找关于整体结构的建议,以及类似于'不要做太多次选择你这个傻瓜,做xxxxx' –