2012-10-31 227 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适用性讨论 –