2012-10-31 144 views
0

以下查詢的第一次運行大約需要45秒,所有下一個查詢只需要1秒。你能解釋一下原因是什麼,以及怎樣才能使查詢在第一次執行時更快運行?SQL查詢緩存

OPEN SYMMETRIC KEY TEST_KEY DECRYPTION BY PASSWORD='password' 

SELECT this.ID FROM SeparationFiles this 
INNER JOIN BarcodeValues b ON this.FIRST_BARCODE_ID = b.ID 
WHERE DecryptByKey(b.ENCRYPTED_VALUE, 0) = 'Peter' 

下面是執行計劃:

Execution plan

回答

2

多少在SeparationFiles表中的行?在掃描SeparationFiles表時,您的查詢成本有50%。在我看來,你可能沒有FIRST_BARCODE_ID列的索引。如果您確實在該列上有索引,則可能需要在索引中包含ID列。

這個查詢第一次運行時,表或者它的某個部分被緩存在內存中。第二次從內存中讀取。這可能解釋了爲什麼第二次更快。但在我看來,真正的問題是索引問題,具體取決於SeparationFiles表中的行數。

0

正如Randy所說,第一次運行這個時,SeparationFiles表中的數據可能是從磁盤讀取並緩存的。下一次執行查詢時,數據在內存中,因此速度更快。

正如蘭迪指出,你應該看看改變查詢,以便它使用索引查找,你有問題是你的where子句是不可SARGable,所以不會使用索引。你或許應該改變where子句:

Where b.encrypted_value = EncryptByKey(key_GUID('password'), 'Peter') 

然後確保你有encrypted_value指數

+0

另見http://stackoverflow.com/questions/799584/what-makes-a-sql-聲明 - 可SARS適用性討論 –