我有以下请求,使用 pg_trm 和 gin 索引:
SELECT
email,
first_name,
last_name
FROM external_patient
WHERE PGP_SYM_DECRYPT(cat_name::bytea, 'SUPER_AES_KEY') ILIKE $2
OR PGP_SYM_DECRYPT(cat_name::bytea, 'SUPER_AES_KEY') % $1
ORDER BY
(PGP_SYM_DECRYPT(cat_name::bytea, 'SUPER_AES_KEY') ILIKE $3) DESC
,(PGP_SYM_DECRYPT(cat_name::bytea, 'SUPER_AES_KEY') ILIKE $2) DESC
,(PGP_SYM_DECRYPT(cat_name::bytea, 'SUPER_AES_KEY') <-> $1)
,PGP_SYM_DECRYPT(cat_name::bytea, 'SUPER_AES_KEY')
LIMIT 30
列 cat_name 已加密,因此必须对其进行解密才能运行请求。但是,我想确保尽可能只解密一次(因为请求是 3ms 没有加密字段,3500 ms 有加密......
是否有特定的语法来确保该列只被解密一次?谢谢您的帮助。
您可以将解密的列添加到 SELECT 并将其包装到派生表中:
我会添加一个带有搜索哈希的新列(或 3 个)。它占用一些空间,但您只能解密一次。
这里
SHA256()
和LOWER()
在 where 子句中,但只计算一次。$1
应该是搜索三元组。