2012-11-09 68 views
0
 `select * from DETAIL a 
     where a.BUILD > GETDATE() - 90 s 
     and (a.IN + a.Rt) NOT IN (SELECT Sample_IN + Rt FROM SUMMARY)     
     and (a.Rt + a.Err) IN 
     (SELECT Rt + Err 
     FROM SUMMARY 
     where (sample_in + rt + err) NOT IN 
     (SELECT in + rt + err FROM DETAIL)) 
     group by a.rt, a.plant, a.in, a.build` 

該查詢顯示性能問題,它在sql2000服務器中運行得更快,但在sql2008R2中表現出較差的性能。兩個ennvironment中的表都具有相同的屬性(列數據類型和索引)。我猜在select子句的「+」運算符中存在一些可行性。誰能幫我 ?SQL子查詢和加入性能問題

+0

我不熟悉sqlserver,所以我不知道你是否可以這樣做,但爲什麼不使用(a.in,a.Rt)不在(select sample_IN,Rt from SUMMARY) – sufleR

回答

3

連接字段時索引不起作用。您可以在表格中創建已組合這些字段的列,並在這些字段上創建索引。這會改善你的表演。

此外,請注意此查詢運行速度更快,使用當前索引(原諒我的拼寫錯誤,你不包括表定義):

select * 
    from DETAIL a 
where a.BUILD > DateAdd(Day, -90, GetDate()) 
    and not exists (select null 
         from SUMMARY 
        where SUMMARY.Sample_IN = a.IN and SUMMARY.Rt = a.Rt) 
    and exists (select null 
       from SUMMARY 
       where not exists (select null 
            from DETAIL 
            where DETAIL.in = SUMMARY.Sample_IN 
             and DETAIL.Rt = SUMMARY.Rt 
             and DETAIL.Err = SUMMARY.Err) 
        and a.Rt = SUMMARY.Rt 
        and a.Err = SUMMARY.Err) 
group by a.rt, a.plant, a.in, a.build 
+0

你好@多米尼克感謝您的建議。上述查詢在sql2000服務器上運行良好,但問題出在sql2008服務器上,你對此有任何想法嗎?連接的列是字符類型..兩臺服務器中的表具有相同的屬性。 – Vignesh

0
select * from DETAIL a 
    left outer join SUMMARY sm1 
     on a.IN = sm1.Sample_IN 
    and a.Rt = sm1.Rt 
    join SUMMARY sm2 
     on a.Rt = sm2.Rt 
    and a.Err = sm2.Err 
    left outer join Detail d 
     on sm2.Sample_IN = d.in 
    and sm2.rt = d.rt 
    and sm2.err = d.err 
    where a.BUILD > GETDATE() - 90 s 
    and sm1.Rt is null 
    and d.in is null 
    group by a.rt, a.plant, a.in, a.build 

這是通過使用連接。對於Dominic Goulet存在的問題,可能會更好。 +1

+0

謝謝@blam,我的疑問是相同的查詢在sql2000中運行良好,但爲什麼它在sql2008失敗..我認爲可能有一個設置相關的問題..你能指導我嗎? – Vignesh

+0

你在SQL2008中有相同的索引嗎?比較查詢計劃並查看它有什麼不同。 – Paparazzi

+0

耶在兩個服務器上都有相同的索引。仍然問題仍然存在 – Vignesh