2011-11-07 1 views
0

ログテーブルを使用して、アプリケーション内のかなりの情報を推測しています。私は、ORMがクエリを実行するのにどれくらいの時間がかかり、ORMを使ってタスクを達成するためのクエリの量に疲れていました。しかし、自分でTSQLを書き込もうとしばらくしてから、私は本当に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. テーブルに書き込むより頻繁に読んでいる場合は、構造の非正規化によってパフォーマンスが向上します。これは、異なるテーブルに物を格納し、問合せ時に外部キーを介してジョインすることでリンクするのではなく、その中にすべてのカラムを持つ1つのワイド・テーブルを持つことになります。参照テーブルを使用して、挿入時の整合性を保証します。結局、 "ログ"エントリは書き込み後に更新されません。
+0

を掲載私はファンダメンタルズに懸念しています。私はこれがクエリを実行する良い方法だとは想像できません。私は全体の構造と何かのような提案を探していますので、 –

関連する問題