运行队列如何在 Snowflake 中工作?是不是有概念时间片?

Posted

技术标签:

【中文标题】运行队列如何在 Snowflake 中工作?是不是有概念时间片?【英文标题】:How does run queue work in Snowflake? Is there a concept timeslice at all?运行队列如何在 Snowflake 中工作?是否有概念时间片? 【发布时间】:2020-09-28 20:13:04 【问题描述】:

我是 Snowflake 的新手,文档不清楚。

    假设我使用一个大型仓库,最大并发查询数为 5 个 有 5 位用户发起了可能需要几分钟才能完成的繁重查询 第 6 个用户有一个简单的查询要执行 运行这 5 个查询的进程是在任何时间点产生还是运行到完成? 第 6 个用户是否必须等到达到超时限制并尝试使用不同的虚拟仓库

谢谢!

【问题讨论】:

【参考方案1】:

这实际上是一个很好的问题,了解它在雪花中的工作原理将帮助您更优化地使用雪花。正如您已经知道的那样,雪花使用虚拟仓库进行计算,这些虚拟仓库只不过是计算节点的集群。每个节点有 8 个核心。因此,当您向虚拟仓库提交查询时,每个查询都由一个或多个核心处理(基于查询是否可以并行化)。因此,如果虚拟仓库没有任何核心来执行第 6 次查询,它将排队。如果您登录到雪花 UI 并单击仓库选项卡,您将通过条形图上的黄色看到这个队列。如果您查询 QUERY_HISTORY 视图,您也可以在“QUEUED_OVERLOAD_TIME”下看到它。

现在,查询始终排队并不是一件好事。因此,最佳实践是拥有多仓库策略。为每组独特的工作负载分配一个专用仓库,以便您可以根据给定工作负载的查询负载水平/垂直扩展它们。

【讨论】:

我觉得这里还有两点。 #1 - 仅仅因为您有一个最大并发数为 5 的仓库,并不意味着 5 个大型查询将实际执行。 Snowflake 可能会确定第一个查询正在使用所有资源,因此会将其余资源排队。 #2 - 如前所述,这就是为什么你应该多集群你的仓库!这允许 Snowflake 在需要时启动额外的计算,而您仍然只需为使用的内容付费!【参考方案2】:

与大多数(所有?)其他数据库一样,队列是先进先出队列。如果一个查询因为其他查询正在消耗集群的所有资源而排队,那么它必须等到其他查询完成(或超时)才能运行。 Snowflake 不会暂停正在运行的查询以“潜入”较小的查询。

您可以随时调整仓库的大小来推送查询。这是来自the documentation 的一句好话:

单集群或多集群(在最大化模式下):语句排队,直到释放已分配的资源或提供额外的资源,这可以通过增加仓库的大小来完成.

【讨论】:

以上是关于运行队列如何在 Snowflake 中工作?是不是有概念时间片?的主要内容,如果未能解决你的问题,请参考以下文章

WebRequest.CachePolicy 是不是应该在 IIS 中运行的代码中工作?

启动 Laravel Artisan 命令队列的最佳方式:在共享主机中工作

如何让 TLinkLabel 在 Delphi 中工作?

如何使节点调度在 Heroku 中工作?

os 模块是不是在 ProcessPoolExecutor 函数中工作?

如何让别名在所有 shell 中工作?