Одна из проблем, которую будет трудно решить, заключается в том, что для поиска с использованием подстановочных знаков требуется какой-либо просмотр индекса или таблицы, который требует дешифрования каждой строки.
Вместо этого оптимизируйте, предварительно зашифровав поисковые значения, чтобы разрешить индексирование зашифрованных значений.
Если вам потребовалось явное сопоставление, вы могли бы сделать что-то подобное, обратите внимание, что шифрование выполняется для входного значения, а не для столбца:
select Client_ID
from tblClient (nolock)
where SSN = convert(nvarchar(11), ENCRYPTBYKEY(@SSN))
Однако ... для поиска вы можете захотеть изучить оптимизацию, которая вроде бы достигает этого, помещая сегменты SSN в отдельные проиндексированные поля, затем анализируя входную строку и выполняя
select Client_ID
from tblClient (nolock)
where SSNFIRST3 = convert(nvarchar(3), ENCRYPTBYKEY( <parsed prefix here> ))
and SSNSECOND2 = convert(nvarchar(2), ENCRYPTBYKEY( <parsed middle section here> ))
Вы выполняете шифрование / дешифрование только для входных значений, а не строк.
Предполагается, что вы пишете немного простого кода регулярного выражения, чтобы разобрать строку поиска на отдельные части для подачи вышеуказанного запроса. Следствием вышесказанного является, по крайней мере, использование поисков по индексу, которое должно быть значительно быстрее, чем у вас сейчас, из-за ограниченного числа посещенных строк.
РЕДАКТИРОВАТЬ: я имел в виду ENCRYPTBYKEY, изменено выше.