需要有关Snowflake优化器的信息



Snowflake使用哪种优化器,基于规则还是基于成本。无法获取任何文档,需要解释如何编写更好的查询。

我发现"知道"规则";与其说了解系统在做什么更有帮助,不如说了解系统的作用更大。

我发现向新的团队成员描述它有大量的表扫描,可以进行映射/减少/合并连接。

您可以通过选择获得所需答案所需的最小列集来加快表的扫描速度。

存在分区修剪,因此,如果数据的"插入/排序"顺序为x 1-2,3-4,5-6,而查询具有x = 5,则前两个分区将不会被读取。

其次,因为它都是合并联接,所以equi联接是最快的。[编辑:]这是在试图说,在百万行及以上的数量级。基于复杂的连接逻辑(如a.v1 > b.v2 or a.v2 < b.v3 ... etc)将1米行连接到1米行意味着你必须或多或少地创建一万亿行以上的行,然后试着看看。这里,就好像你可以对精确的值a.v1 = b.v2 and a.v2 = b.v2进行连接一样,现在可以根据这些键对数据进行排序,并且可以进行合并连接,你的性能非常好(在维基百科上对合并连接进行排序)。

这意味着,有时在不同的CTE中多次读取同一组源表,并连接这些表可能是处理大量数据的最快方法。[编辑:]在上述语句的上下文中,通常在小型数据库SQL中,人们会进行相关的子查询,因为a)你可以,为什么不呢?b)他们在索引数据库上可以很快。但是,在没有索引的雪花中,除了优化器不支持大多数相关的子查询外,您通常应该避免它们,在两个CTE中读取两次数据,并通过equi-join连接/左连接这些数据,以回答已经完成的问题,因为CTE的任务是独立的,因此可以并行,合并连接接近最佳。对于不在主联接体中的数据,计算(假设小计)的浪费小于并行性的收益。(与加快5秒以下大小的查询相比,这对于30秒或更长范围内的查询最有效)。但对于所有的东西,都要有一个基本模型,尝试/实验,戳和其他缓慢的东西,直到你无法重组数据或查询以使其更快。

和往常一样,查看运行查询的概要文件,查找删除了许多行的区域,并思考如何重组逻辑,以便在管道的早期推动这些限制。

在以下文档中可以找到简要描述:基于雪花计算的雪花弹性数据仓库

3.3.1查询管理和优化

(…)

Snowflake的查询优化器遵循典型的Cascades-风格方法[28],具有自上而下的基于成本的优化。用于优化的所有统计信息都自动为主-在数据加载和更新时获得。既然雪花不使用索引(参见第3.3.3节),计划搜索空间比其他一些系统中的要小。平面空间为通过将许多决策推迟到execu来进一步减少-tion时间,例如联接的数据分布类型。这种设计减少了优化器,以小峰值性能损失。它还使系统更容易使用(性能变得更加可预测)符合Snowflake对服务体验的整体关注。优化器完成后,生成的执行计划分布到属于查询随着查询的执行,云服务不断跟踪查询的状态以收集性能计数器并检测节点故障。所有查询信息和统计信息-存储TIC用于审计和性能分析。(…)

查询优化:

Snowflake支持查询矢量化,并进行一些基于成本的优化。但它的首次查询运行时间通常是几秒到几分钟。Snowflake添加了本地磁盘"缓存"和结果缓存,以加快后续对重复工作负载(如报告和仪表板)的查询。

优化存储:

Snowflake有一个比S3更优化的微分区文件系统,支持使用集群键进行分区和排序将数据拆分为多个小文件,以支持Snowflake中的最佳数据加载。

提高查询性能

  1. 考虑为大型表实现集群键
  2. 尝试执行相对同质的查询(大小、复杂性等),数据集等)

提高负载性能

  1. 使用批量加载将数据获取到Snowflake中的表中。考虑拆分大型数据文件,因此负载可以在集群
  2. 从内部阶段中删除不再需要的文件。您可能会注意到除了节省成本之外,还能提高性能
  3. 将加载和转换作业与查询隔离,以防止资源争用。专门为装载和查询操作提供单独的仓库,以优化性能
  4. 利用可扩展的计算层来完成大部分数据处理。考虑在微批处理场景中使用Snowpipe。您的查询可能受益于缓存上一次执行的结果
  5. 使用单独的仓库进行查询和加载任务。这将有助于有针对性地提供仓库,避免在不同的操作
  6. 对大文件使用单独的数据仓库
    服务器的数量和容量决定了数据文件的数量

段数据

Snowflake将数据缓存在虚拟数据仓库中,但对数据进行分段仍然至关重要。考虑以下数据查询性能的最佳实践:

将具有常见查询的用户分组在同一虚拟数据仓库中,以优化数据检索和使用
Snowflake查询配置文件支持查询分析,以帮助识别和解决性能问题。Snowflake从同一个虚拟数据仓库中提取数据,以支持复杂的数据科学操作、商业智能查询和ELT数据集成。

放大

Snowflake允许在虚拟数据仓库中进行扩展,以更好地处理大型工作负载。当使用放大来提高性能时,请注意以下几点:

Snowflake支持快速轻松地调整仓库大小以处理工作量
它还可以自动暂停或恢复放大,对用户来说完全透明
Snowflake的放大功能支持不断变化的加工要求。

横向缩小

Snowflake支持部署相同大小的集群以支持并发。关于扩展如何帮助性能优化,请记住以下几点:

当用户执行查询时,虚拟数据仓库会自动将集群添加到固定的限制
它可以以更可控的方式扩大规模,而不是像传统数据平台那样部署一个或多个大型机器集群
Snowflake根据用户查询自动调整,并根据需要在高峰和非高峰时段自动集群。

最新更新