2014-05-22 72 views
0

我有一個子查詢,我正在使用一個更大的選擇查詢,我需要優化才能將其上傳到Domo。我正在嘗試爲交易是否包含特定項目添加「是/否」列。這將顯示在交易的所有行上。SQL案例查詢優化

它可以正常工作,但我正在處理大量數據,以至於軟件在超過所有數據之前超時。我可以在SQL SMS 2012中沒有任何問題的情況下運行查詢,但有沒有更簡單/更快的方式來執行此操作?謝謝!

case 
when transactions.transaction_id in 
    (select transaction_id 
    from transaction_lines 
    where item_id_0 = 'msa500' 
    group by transaction_id) then 'Yes' 
else 'No' 
end as ContainsMSA500 
+0

您可以將您的子查詢移至CTE。應該工作得更快,因爲CTE將被檢索一次,而子查詢檢索每行 – cha

+0

謝謝......我將對CTE進行一些研究。你能舉個例子嗎?我對SQL很陌生。 – aearce2000

+1

@cha。 。 。你在哪裏得到這個想法?據我所知,SQL Server並沒有實現一般的CTE。如果您知道其他文檔,我會很高興看到它。 –

回答

2

您可以通過執行優化這個:

(case when exists (select 1 
        from transaction_lines tl 
        where tl.item_id_0 = 'msa500' and 
         tl.transaction_id = transactions.transaction_id 
       ) 
     then 'Yes' 
     else 'No' 
end) as ContainsMSA500 

然後在transaction_lines(transaction_id, item_id_0)創建索引。

將此問題化爲group by的問題是,SQL Server必須每次都生成整個列表。通過使用exists進行公式化,SQL Server可以在索引中查找值 - 通常快得多。

在SQL Server 2012中,in版本可能進行優化:

(情況TRANSACTION_ID時(從transaction_lines TL 其中tl.item_id_0 = 'MSA500' ) 然後 '是' 選擇tl.transaction_id else'否' end)as ContainsMSA500

雖然在邏輯上相同,但刪除group by可能會有所幫助。

最後的選項是把這個放在查詢的from子句中。沒有看到整個查詢就很難解釋。

+0

謝謝!這看起來好多了! – aearce2000