Snowflake中状态为Blocked的merge查询是否会最终执行完成?
Snowflake Merge查询Blocked状态问题解答
Blocked状态的查询是否能最终执行完成
Snowflake中查询进入Blocked状态的核心原因是事务锁冲突:当前查询需要申请的表、分区或行级资源锁,已经被其他未结束的会话事务持有,且两者锁类型互斥。
- 只要持有冲突锁的会话最终完成操作、提交或回滚事务释放锁,你的merge查询就会自动恢复调度执行,最终正常完成。
- 只有当持有冲突锁的会话长期挂起不结束(比如操作终端异常断开没有触发事务回滚、对应业务逻辑存在未处理的事务挂起漏洞),或者触发了未被系统自动检测的极端死锁场景时,查询才会一直停留在Blocked状态无法推进。
你可以通过QUERY_HISTORY系统视图的BLOCKED_BY_SESSION_ID字段定位到阻塞当前查询的会话ID,若确认对应会话属于无效会话,可以联系账号管理员手动终止会话释放锁,merge查询会立即恢复执行。
关于Blocked状态等于表资源被锁定、同表无法运行其他查询的理解是否正确
这个理解存在偏差,Snowflake采用细粒度锁机制+多版本并发控制(MVCC),不会因为单个写操作Blocked就导致整表不可用:
- 只有其他待执行的操作也需要申请和当前持有锁事务互斥的锁资源时,才会被阻塞:比如你的merge操作持有对应资源的写锁,其他DML写操作(INSERT/UPDATE/DELETE/MERGE)需要申请同资源的写锁时,才会出现阻塞。
- 普通只读SELECT查询不需要申请写锁,会直接访问对应数据的快照版本,哪怕表上存在未提交的写事务,SELECT操作也可以正常执行,不会被阻塞。
内容的提问来源于stack exchange,提问作者Faisal Shani
相关产品推荐
相关产品推荐

