如何在雪花中处理并发查询?
how are concurrent queries handled in snowflake?
例如,如果我有一个任务正在向 table 中插入行,而另一个任务正在 运行 插入相同的 table,会发生什么情况?
我问是因为我有一个任务,每分钟 运行s 将行插入 table,然后是读取和 t运行 相同的 lambda table 即每分钟 运行 秒。我知道下雪任务和事件桥不会 运行 每分钟都在点上,所以我还没有真正 运行 进入这个问题,但我认为它最终会发生。
雪花如何处理这个问题?
table 将被运行的第一个事务锁定,后续事务将排队等待前面的事务完成。
顺便说一句(这可能是你的问题的重点)让两个这样的进程独立运行似乎不是一个好的设计 - 因为 lambda 进程似乎在逻辑上依赖于任务。
其他SQL引擎中的概念相同,将放置资源锁。
在 Snowflake 世界中,INSERT 将具有 PARTITION 级别锁定,因为大多数 INSERT 语句仅写入新分区。
请参阅以下文档:
https://docs.snowflake.com/en/sql-reference/transactions.html#resource-locking
如果 INSERT 查询在 TRUNCATE 之前提交,则 TRUNCATE 必须等到 INSERT 查询完成。不能同时对同一个资源进行操作。
见下图,第一个查询是 INSERT,它是 HOLDING PARTITION 级别的锁,而第二个查询是 TRUNCATE,它处于 WAITING 状态:
例如,如果我有一个任务正在向 table 中插入行,而另一个任务正在 运行 插入相同的 table,会发生什么情况?
我问是因为我有一个任务,每分钟 运行s 将行插入 table,然后是读取和 t运行 相同的 lambda table 即每分钟 运行 秒。我知道下雪任务和事件桥不会 运行 每分钟都在点上,所以我还没有真正 运行 进入这个问题,但我认为它最终会发生。
雪花如何处理这个问题?
table 将被运行的第一个事务锁定,后续事务将排队等待前面的事务完成。
顺便说一句(这可能是你的问题的重点)让两个这样的进程独立运行似乎不是一个好的设计 - 因为 lambda 进程似乎在逻辑上依赖于任务。
其他SQL引擎中的概念相同,将放置资源锁。
在 Snowflake 世界中,INSERT 将具有 PARTITION 级别锁定,因为大多数 INSERT 语句仅写入新分区。
请参阅以下文档: https://docs.snowflake.com/en/sql-reference/transactions.html#resource-locking
如果 INSERT 查询在 TRUNCATE 之前提交,则 TRUNCATE 必须等到 INSERT 查询完成。不能同时对同一个资源进行操作。
见下图,第一个查询是 INSERT,它是 HOLDING PARTITION 级别的锁,而第二个查询是 TRUNCATE,它处于 WAITING 状态: