2011-05-20 62 views
1

我已經得到了下面的代碼,它運行得很好,只需要幾秒鐘來計算答案 - 我想知道是否有一個更快/更整潔的方式來編寫此代碼 - 如果是這樣,我做錯了什麼?優化/簡化遊標sql

感謝

select case when 
    (select LSCCert from matterdatadef where ptmatter=$Matter$) is not null then 
    (
     (select case when 
      (SELECT top 1 dbo.matterdatadef.ptmatter 
      From dbo.workinprogress, dbo.MatterDataDef 
      where ptclient=(
       select top 1 dbo.workinprogress.ptclient 
       from dbo.workinprogress 
       where dbo.workinprogress.ptmatter = $matter$) 
       and dbo.matterdatadef.LSCCert=(
       select top 1 dbo.matterdatadef.LSCCert 
       from dbo.matterdatadef 
       where dbo.matterdatadef.ptmatter = $matter$) 
      )=ptMatter then (
       SELECT isnull((DateAdd(mm, 6, (
         select top 1 Date 
         from OfficeClientLedger 
         where (pttrans=3) 
          and ptmatter=$matter$ 
         order by date desc))), 
        (DateAdd(mm, 3, (
         SELECT DateAdd 
         FROM LAMatter 
         WHERE ptMatter = $Matter$))) 
      ) 
     ) 
     end 
     from lamatter 
     where ptmatter=$matter$) 
    ) 
    end 

回答

1

它看起來像這樣你的SQL是從報告工具生成的。問題是您正在執行SELECT top 1 dbo.matterdatadef.ptmatter...查詢lamatter的每行。進一步減慢執行,在該查詢中,您將重新計算ptclient和LSCCert的比較值 - 在執行期間不會更改的值。

最好使用適當的連接和工藝的查詢,以通過避免相關子(即在連接表參考值與必須爲表的每一行被執行的查詢)只執行一次每一個部分。計算值是可以的,只要它們只計算一次 - 即從最後的where子句中。

下面是一個簡單的例子來說明一個相關子

不良的SQL:

select a, b from table1 
where a = (select c from table2 where d = b) 

在這裏,子選擇運行的每一行,這將是緩慢的,特別是不具有對錶2的索引(d)

更好的SQL:

select a, b from table1, table2 
where a = c and d = a 

這裏的數據庫每次掃描最多一次,這將會很快