2014-03-12 32 views
0

我運行一個存儲過程中,我有以下查詢SQL查詢時間太長 - 幫助有更好的表現

SELECT TOP 1 @TopValue = t2.myDecimal 

from table1 t1, table2 t2 

where t1.ID = t2.table1ID 

and CONVERT(VARCHART(8), t1.Created, 112) = @stringYYYYMMDD 

and t1.Term = @Label" 

TopRate是十進制(8,6) stringYYYYMMDD是代表日期的字符串格式爲YYYYMMDD 標籤是一個簡單的varchar(8)

這個查詢是爲我的數據集的每一行調用的,可以從10到5000.如果我評論這個查詢,過程執行時間在2秒以內。隨着查詢包括,它永遠不會結束。

我使用的是Microsoft SQL Server Management Studio中2008 R2

謝謝您的幫助

回答

5

首先,你應該使用顯式join語法。其次,只要你有一個top沒有order by它是可疑的。所以,你的查詢,我看到它是:

select TOP 1 @TopValue = t2.myDecimal 
from table1 t1 join 
    table2 t2 
    on t1.ID = t2.table1ID 
where CONVERT(VARCHART(8), t1.Created, 112) = @stringYYYYMMDD and t1.Term = @Label" 

你可以加快一些索引。但是,在這之前,你要更改日期比較:

where t1.Created >= convert(datetime, @stringYYYYMMDD, 112) and 
     t1.Created < convert(datetime, @stringYYYYMMDD, 112) + 1 and 
     t1.Term = @Label 

從列移動功能,不斷使比較「優化搜索」,這意味着索引可以使用它。

接下來,創建索引table1(Term, Created, Id)table2(table1Id)。這些指標應該會提升業績。

+0

+1。作爲字符串的t1比較是一個典型的初學者錯誤 - 它沒有機會使用索引。 – TomTom

+0

我第一次嘗試你的解決方案,它工作正常,但它是因爲我忘記在t1.Created Greg

+0

'Created'的數據類型是什麼? –