0

以下查询的第一次运行大约需要 45 秒,接下来的所有查询只需要 1 秒。您能否解释一下原因是什么以及如何使查询在第一次执行时运行得更快?

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'

这是执行计划:

执行计划

4

2 回答 2

2

SeparationFiles 表中有多少行?您在扫描 SeparationFiles 表时获得了 50% 的查询成本。在我看来,您可能在 FIRST_BARCODE_ID 列上没有索引。如果您在该列上确实有索引,则可能需要在索引中包含 ID 列。

第一次运行这个查询时,表,或者它的一部分,被缓存在内存中。第二次是从内存中读取的。这可能解释了为什么第二次更快。但在我看来,真正的问题是索引问题,具体取决于 SeparationFiles 表中的行数。

于 2012-10-31T11:34:40.823 回答
0

正如 Randy 所说,第一次运行时,SeparationFiles 表中的数据可能会从磁盘读取并缓存。下次执行查询时,数据在内存中,因此速度更快。

正如 Randy 指出的那样,您应该考虑更改查询以使其使用索引搜索,但您遇到的问题是您的 where 子句是非 SARGable 的,因此无论如何都不会使用索引。您可能应该将 where 子句更改为:

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

然后确保您在 encrypted_value 上有一个索引

于 2012-11-04T23:25:23.623 回答