Redshift物化视图执行refresh操作时是否会锁定基础表?
Redshift 物化视图刷新序列化冲突问题解答
核心问题解答
REFRESH MATERIALIZED VIEW操作本身不会对基础表加排他锁,不会阻塞基础表的正常读写操作,你之前的判断是正确的。
你遇到的可序列化隔离冲突,是Redshift默认事务隔离级别的机制导致的,和锁表无关:Redshift默认使用可序列化隔离级别,当多个并发事务同时操作相同数据集,且数据库无法保证这些事务的执行顺序符合序列化一致性要求时,就会抛出该错误。
你场景中的冲突来源
你的冲突来源就是三类并发操作的时间窗高度重叠:
- 物化视图单次刷新耗时7分钟,每10分钟触发一次,每次刷新全程都会读取4张基础表的数据
- Firehose每5分钟就会执行一次
COPY命令往基础表写入数据,写入操作和物化视图的读操作并发时,很容易触发序列化冲突 - 每15分钟执行一次的Quicksight SPICE数据集刷新也会读取基础表,进一步提升了并发冲突的概率
可落地的解决方法
- 调整刷新操作的事务隔离级别:在执行刷新命令的会话中,先执行
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;,再执行REFRESH MATERIALIZED VIEW语句。读提交隔离级别不会触发序列化冲突,绝大多数分析场景下该隔离级别完全满足业务需求。 - 开启物化视图增量刷新:如果你的物化视图满足Redshift增量刷新的适用条件(未使用不支持增量的聚合/窗口函数、基础表配置了合适的主键等),优先切换为增量刷新,可将单次刷新耗时从7分钟降低到秒级,从根本上降低冲突概率。
- 调整调度策略:拉长物化视图的刷新间隔到15分钟以上,同时刻意错开SPICE数据集、Firehose COPY操作的执行时间窗,减少多类操作并发的概率。
- 调整Firehose写入策略:如果业务允许,适当调大Firehose的缓冲区阈值,将COPY操作的执行频率从5分钟一次降低到10分钟一次,减少写入操作的并发次数。
内容的提问来源于stack exchange,提问作者dbep
相关产品推荐
相关产品推荐

