RLS 性能最佳实践 - Amazon Redshift
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

复杂策略

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