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 列を含める必要がある場合があります。

このクエリを初めて実行すると、テーブル、またはその一部がメモリにキャッシュされます。2 回目はメモリから読み取られます。これはおそらく、2回目のほうが速い理由を説明しています。しかし、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 に答える