我的 Amazon Redshift 集群的实体化视图没有刷新。
简短描述
在 Amazon Redshift 中,以下场景会阻止实体化视图刷新或导致其完成时间过长:
- 权限错误会阻止 REFRESH MATERIALIZED VIEW 操作。
- 基表上并发执行的 VACUUM 和 TRUNCATE 操作会阻止刷新并返回以下错误: “Invalid operation: Materialized view mv_name could not be refreshed as a base table changed physically due to vacuum/truncate concurrently.Please try again”。
- REFRESH MATERIALIZED VIEW 无法刷新。
- 活动工作负载会阻止自动刷新活动。
解决方法
**注意:**对于 Amazon Redshift Serverless 集群,请使用 SYS 监控视图,而不是预置集群中使用的系统视图(STL、STV、SVL、SVV)。有关详细信息,请参阅用于迁移到 SYS 监控视图的系统视图映射。
REFRESH MATERIALIZED VIEW 权限错误
要对实体化视图执行 REFRESH MATERIALIZED VIEW 操作,您必须是所有者。您还必须对基础基表拥有 SELECT 权限,对架构拥有 USAGE 权限。
要进行完全的重新计算操作,您必须对架构拥有 CREATE 权限。有关如何定义权限的详细信息,请参阅 GRANT。
有关自动刷新的详细信息,请参阅自动刷新实体化视图。
当提交 REFRESH MATERIALIZED VIEW 和 VACUUM 以在基表上并发运行时,会出现以下错误: “Invalid operation: Materialized view mv_name could not be refreshed as a base table changed physically due to vacuum/truncate concurrently.Please try again;”。
操作完成后,请重新提交 REFRESH MATERIALIZED VIEW 命令。
REFRESH MATERIALIZED VIEW 刷新失败
以下操作可能会导致实体化视图刷新失败:
- 您重命名或删除了某一列。
- 您更改了某一列的类型。
- 您更改了基表或架构的名称。
**注意:**在这些情况下,实体化视图可以查询,但无法刷新。即使该列未在实体化视图中使用,这些约束也适用。
错误消息示例:
- Detail: Procedure <mv_sp_*****_2_1> does not exist.
- column <column name> does not exist.
- DETAIL: schema "<schema name>" does not exist.
- ERROR: Materialized view <my name> is unrefreshable as a base table was renamed.
要查看实体化视图的刷新活动,请对 Amazon Redshift 预置集群使用 SVL_MV_REFRESH_STATUS,对 Amazon Redshift Serverless 集群使用 SYS_MV_REFRESH_HISTORY。
要查找实体化视图中的数据是否过时并查看实体化视图的状态信息,请使用 STV_MV_INFO、SYS_MV_STATE 或 SYS_MV_REFRESH_HISTORY。
当实体化视图无法刷新时,请将其删除并重新创建以维护当前数据。
长时间运行的 REFRESH MATERIALIZED VIEW 操作
REFRESH MATERIALIZED VIEW 命令在集群上作为普通查询执行。
要验证查询执行情况,请执行以下操作:
要监控 REFRESH MATERIALIZED VIEW 操作,请使用以下系统视图:
如果您的 REFRESH MATERIALIZED VIEW 性能缓慢,请参阅查询性能改进。
活动工作负载期间刷新状态已隐藏
Amazon Redshift 会优先考虑您的工作负载,而不是自动刷新。这种优先级排序可能会暂停自动刷新以维持工作负载的性能,并延迟对某些实体化视图的更新。在某些情况下,您的实体化视图可能需要更可预测的刷新行为。
要实现可预测的刷新行为,请执行以下操作:
- 手动运行 REFRESH MATERIALIZED VIEW。
- 通过 Amazon Redshift 调度器 API 或控制台计划刷新。