RLS 性能最佳实践
以下是确保 Amazon Redshift 在受 RLS 保护的表上能够获得更高性能的最佳实践。
运算符和函数的安全性
当查询受 RLS 保护的表时,使用某些运算符或函数可能会导致性能下降。对于查询受 RLS 保护的表,Amazon Redshift 会将运算符和函数分类为安全或不安全。如果根据输入,函数或运算符没有任何可观察到的副作用,则该函数或运算符将被分类为 RLS 安全。特别是,RLS 安全的函数或运算符不能是以下情况之一:
-
输出输入值,或任何依赖于输入值的值,无论是否显示错误消息。
-
失败或返回依赖于输入值的错误。
RLS 不安全的运算符包括:
-
算术运算符:+、-、/、*、%。
-
文本运算符:LIKE 和 SIMILAR TO。
-
强制转换运算符。
-
UDF。
使用以下 SELECT 语句以检查运算符和函数的安全性。
SELECT proname, proc_is_rls_safe(oid) FROM pg_proc;
在规划对受 RLS 保护的表进行查询时,Amazon Redshift 将对包含 RLS 不安全运算符和函数的用户谓词的评估顺序施加限制。在查询受 RLS 保护的表时,引用 RLS 不安全运算符或函数的查询可能会导致性能下降。当 Amazon Redshift 无法将 RLS 不安全谓词向下推送到基表扫描以利用排序键时,性能可能会显著下降。为了获得更高性能,请避免使用利用排序键的 RLS 不安全谓词进行的查询。要验证 Amazon Redshift 是否能够向下推送运算符和函数,您可以将 EXPLAIN 语句与系统权限 EXPLAIN RLS 结合使用。
结果缓存
为了缩短查询运行时间并提高系统性能,Amazon Redshift 在领导节点的内存中缓存特定查询类型的结果。
在满足未受保护的表的所有条件并且满足以下所有条件时,Amazon Redshift 会将缓存的结果用于新查询来扫描受 RLS 保护的表:
-
未曾修改策略中的表或视图。
-
策略不使用在每次运行时必须求值的函数,如 GETDATE 或 CURRENT_USER。
为了获得更高性能,请避免使用不满足前述条件的策略谓词。
有关 Amazon Redshift 中的结果缓存的更多信息,请参阅 结果缓存 。
复杂策略
为了获得更高性能,请避免将复杂策略与联接多个表的子查询配合使用。