我的 Amazon Redshift 集群的实例化视图没有刷新。为什么会发生这种情况?如何刷新我的物化视图?
简短描述
以下情形可能会导致 Amazon Redshift 中的实例化视图无法刷新或需要很长时间才能完成:
- REFRESH MATERIALIZED VIEW 因权限错误而失败
- 您会看到这样的错误讯息: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 已提交并运行了很长时间
- 由于工作负载处于活动状态,刷新活动未显示在自动刷新中
解决方法
REFRESH MATERIALIZED VIEW 因权限错误而失败
要对实体化视图执行 REFRESH MATERIALIZED VIEW 操作,您必须是所有者。此外,您必须具有以下特权:
- 基础基表上的 SELECT 特权
- 模式上的 USAGE 特权
如果实体化视图是完全重新计算而不是增量刷新,则还必须具有该架构的 CREATE 权限。要定义权限,请参阅 GRANT。有关详细信息,请参阅自动刷新实例化视图。
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 和 VACUUM 以在基表上并发运行时,会出现此错误。操作完成后,可以重新提交 REFRESH MATERIALIZED VIEW。
REFRESH MATERIALIZED VIEW 不可刷新
无法刷新的实例化视图可能是由以下操作引起的:
- 重命名或删除某一列。
- 更改列的类型。
- 更改基表或架构的名称
**注意:**此条件下的实体化视图可以查询,但不能刷新。即使实例化视图中未使用该列,上述约束也适用。
要查找实体化视图中的数据是否过时以及实体化视图状态信息,请使用 STV_MV_INFO。要查看实体化视图的刷新活动,请使用 SVL_MV_REFRESH_STATUS。在这种无法刷新的实例化视图状态下,必须删除并重新创建该实体化视图,以使该实体化视图保持最新状态。
以下是您可能会看到的错误消息示例:
```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 <mv namme> is unrefreshable as a base table was renamed.```
REFRESH MATERIALIZED VIEW 已提交并运行了很长时间
REFRESH MATERIALIZED VIEW 充当在集群上运行的普通查询。要确认查询正在运行,请执行以下操作:
REFRESH MATERIALIZED VIEW 的操作性能受以下因素的影响:
如果您遇到 REFRESH MATERIALIZED VIEW 性能缓慢的问题,请参阅 Improve query performance。
由于工作负载处于活动状态,刷新活动未显示在自动刷新中
Amazon Redshift 优先考虑您的工作负载而不是自动刷新。这种优先级设置可能会停止自动刷新以保持工作负载的性能,并可能延迟某些实例化视图的刷新。在某些情况下,您的实例化视图可能需要更具确定性的刷新行为。要创建更具确定性的刷新行为,请使用以下方法:
有关详细信息,请参阅自动刷新实例化视图。