query-optimization - 雪花仓库选择
问题描述
我们的 ETL 作业有时会在雪花中运行。我们有两个仓库中型和 2xl。我们遵循的规则之一是,如果查询运行时间少于 10 分钟,我们将转移到中型仓库,超过 2XL 的任何内容。但这是正确的隔离方式吗?
我知道 Snowflake 根据核心可用性使查询并行化。例如
2XL 集群有 32 个节点,每个节点 8 个核心。Snowflake 尝试将每个查询拆分为 256 个部分。例如,如果我们运行一个查询:
select sum(a) from mytable;
然后 256 个核中的每一个扫描表的 1/256。
但是我怎么知道一个表是否可以拆分为 256 个核心,它可能没有足够的数据进行拆分。在这种情况下,在 2XL 上运行查询没有意义。
谢谢
解决方案
这都是一个相当主观的问题。
如果您同时运行 medium 和 2XL,为什么不在 2XL 上运行所有程序并保存 Medium,就像您在 2XL 的运行时间少于 60 秒的情况下向上/向下旋转您所支付的费用一样60 秒。对于以完全线性方式花费 > 10 分钟的查询,将花费超过 1 分钟。
您如何知道它是否可以拆分部分是理论上的,它是否本质上是平行的
select id, count(*) from table group by id;
你有很多 id,非常并行,即使你只有一个 id,由于计数不冲突,这仍然是可并行化的.. where-as
select id, count(distinct column2) ...
需要为每个 id 构建 column2 的集合,因此 32 个实例不会获得太多。但是 IO 负载转换仍然可能是代价高昂的部分..
所以它取决于查询的约束,正在运行,以及它处理的数据。这意味着您应该在不同大小的服务器上运行查询,以查看您的数据负载是否可以扩展。
推荐阅读
- excel - 如何在 Excel 中连接来自同一列和不同行的多个单元格?
- javascript - Discord.js 拍命令
- matlab - Matlab 符号工具箱中的 Subs 不计算值
- tcp - Hazelcast tcp-ip 配置集群:即使指定了集群名称,不需要的 IP 也会加入集群
- javascript - TypeError:无法获取 - 仅在 Cordova 应用程序上
- css - 如何让一个 div 覆盖所有可用的垂直空间,然后将它包裹在一个行方向的 flexbox 布局中?
- assembly - 为什么让一些寄存器调用者保存而另一些寄存器保存被调用者?为什么不让调用者保存它想要保存的所有内容?
- java - Firebase:对收到的通知进行 POST 请求
- r - 与条形图相比,误差线图太大?
- node.js - Nest 无法解析 WithdrawService 的依赖关系