我对雪花很陌生,当我和雪花一起工作的时候,我在下面的两个选项之间发生了冲突。
hour)
G 211
考虑到上述两种选择
从性能的角度选择第二个选项,有什么优势吗?
注意事项:我知道多集群相对于单个仓库的优势。请分享您对这个特定场景的答案(当min =max时)。
发布于 2021-08-31 01:41:43
所以在运行查询时发生的事情是。
属于,我将只使用single来表示单个实例,“multi”表示多实例集群,当我们运行一个查询时,它只在一个实例上运行。
从存储层读取\写入IO:
在这里,单一的IO是多个IO的两倍,因此,如果您的查询是IO饱和的,那么单变量是更好的选择。
并行步骤:
因此,如果在高基数列上有一个GROUP BY,那么单列和多列都应该是同样好的。如果基数较低,但行数为数十亿行,则较小的实例可能会提供更好的结果,因为这些复杂的步骤不能在单个实例的较大集群大小上中断。但是,如果您有许多并发查询,这很可能会丢失。
多个查询/噪声邻居:
如果您有数百个查询,那么更大的单个实例在启动这些查询时会更糟糕,因为它一次只具有较少的并发任务,而一个非常大的查询可以刷新缓存或控制集群,这意味着您停止处理普通/小型查询。其中-当拥有mutli集群时,如果只有一个“超大型”查询出现,您只会拖住一半的常规查询。
这也取决于您的加载模式,在我的上一份工作中,我们有用于回答仪表板、报表的读取查询的小型实例的自动缩放集群,我们允许它运行得有点过度,所以一切都很顺利。当我们的数据加载在第二个自动缩放的中型实例集群上运行时,当我们试图以最快/最便宜的方式加载数据时,我们是故意超载的。在非高峰时期,我们以编程的方式减少了自动崩溃的最大值,使负载几乎饿死。但是会通过“午夜”中节省的学分在大型实例上进行一些昂贵的再处理,而且我们的加载任务还能够拆分专用的LARGE+大小仓库来完成一次性重建,因为这都是IO绑定的工作,因此“中断”窗口越小,系统越好,IO规模成线性,因此总成本是相同的。
也就是说,“什么是最好的”实际上取决于你正在做什么,你的预算,以及你准备好的取舍。雪花的黄金之处--它不像一个经典的DB,你必须选择合适的大小,挑选一个,然后看着它,如果它在飞行中艰难地改变它。当我们的代码或雪花版本改变了一些关键SQL的性能时,我们多次这样做,我们会跳进去,将实例数或大小增加一倍或三倍,以克服这种情况,同时试图修复或处理SF问题,或者等待SF回滚。在几个小时内,通常花更多的学分并不是预算的刹车。这种灵活性还意味着您可以尝试一下,“如果我们尝试4倍小的实例会发生什么。”“哦,没什么.听着,我们刚省了一堆钱”..
发布于 2021-08-30 09:05:30
如果您有min=max=2,那么您将永久地运行2个仓库(只要它们没有挂起)。如果您像这样配置您的多集群仓库,那么您就失去了许多优势,但对于您的特定用例,我想这可能是有意义的。
发布于 2021-08-30 15:04:26
根据你的评论,以下是我的回答:
在这两种情况下,您将拥有相同的资源来处理您的查询。重要的区别在于运行单一的重查询。您可能知道,单个查询不能生成多个集群(尚未),因此当您在多集群仓库中运行一个查询时,将在其中一个大型仓库上处理该查询(并使用最多8个节点)。
如果在单个XL仓库上运行相同的查询,则它可以由(最多)16个节点执行。因此,如果您将运行大量需要更多内存和CPU的查询,那么使用单个XL仓库会更好。
关于并发性,有一个名为"MAX_CONCURRENCY_LEVEL“的参数。它的默认值是8,它限制了每个仓库并发执行的最大数量。如果不更改它,那么单个XL仓库将最多同时执行8个查询,而多集群仓库可以同时执行16个查询。
https://docs.snowflake.com/en/sql-reference/parameters.html#max-concurrency-level
您可以增加此参数,并在单个XL和多集群L仓库上提供相同的并发性。但是在这种情况下,当您一起运行重查询和轻查询时,您应该小心。因为一个查询可能使用仓库的大部分资源,而轻量级的查询可能会占用更少的资源和更长的时间。因此,我建议您使用多集群仓库,如果您有“相对”的轻量/并发查询。
https://stackoverflow.com/questions/68981182
复制相似问题