RLS 性能最佳实践 - Amazon Redshift

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 中的结果缓存的更多信息,请参阅 结果缓存

复杂策略

为了获得更高性能,请避免将复杂策略与联接多个表的子查询配合使用。