【.com快译】想象一下:如果没有任何索引,也没有数据库本身的调优选项,你将如何优化Snowflake数据仓库?众所周知,Snowflake的设计非常简单,并且提供的性能调优选项很少。本文为您总结了五个提高查询性能的最佳实践。单独查询工作负载?最大化吞吐量和最小化Snowflake延迟的首选方法是分离工作负载的查询。下图说明了一种常见的Snowflake部署设计模式——工作负载分离(请参阅https://www.analytics.today/blog/what-is-the-ideal-cloud-datawarehouse-platform)。与其他数据库系统不同,Snowflake是为云构建的。可以高效支持无限数量的虚拟仓库,即多个独立规模的计算集群。他们共享对公共数据存储的访问权限。这种EPP(ElasticParallelProcessing,弹性并行处理,参见https://www.analytics.today/blog/four-stages-that-revolutionised-database-architecture)架构可以运行复杂的数据科学操作。在对相同数据执行ELT加载和商业智能查询时,该架构不会竞争任何资源。通常,我们经常需要根据部门或团队来分离不同的工作负载。例如:通过为每个团队提供自己的虚拟仓库来帮助跟踪团队使用情况。实际上,最好按工作负载类型而不是用户组来分隔工作负载。这意味着在一个仓库中,当营销用户在进行商业智能类型的查询时,我们可以运行另一个单独的虚拟仓库来支持超快速的财务仪表盘类型的查询。在一个案例中,我们的一个客户计划运行15个超小型仓库,为每个团队提供自己的专用计算资源。但是经过分析使用,我们改成了四个更大的虚拟仓库。这种方式不仅可以让运营成本更低,而且可以在大幅提升性能的前提下提升用户体验。最大限度地利用Snowflake缓存下图展示了Snowflake是如何在虚拟仓库(本地磁盘缓存)和结果缓存(ResultCache)中自动缓存数据的。虽然以上是自动化行为,但您可以通过以下两个最佳实践最大限度地提高缓存使用率并加快查询性能。首先,在拆分查询工作负载时,应该能够让用户在同一个虚拟仓库中查询相同的数据。这样,某个用户从缓存中检索到的数据将很可能被其他人使用。此外,您应该避免在不使用虚拟存储库时仓促暂停它们。默认情况下,任何仓库都会在10分钟后自动挂起,需要执行SQL语句时自动恢复。当然,您可以将自动挂起设置为几秒钟,以节省资源。但需要注意的是,恢复后,虚拟仓库的缓存可能会被清空,这意味着你将失去原有的缓存性能优势。最后请注意:由于结果缓存完全独立于虚拟仓库,因此任何用户使用其帐户执行的任何查询都会从结果缓存中生成完全相同的SQL文本。ScaleUp以适应大型工作负载虽然这不是严格意义上的数据库调优,但使用Snowflake的虚拟仓库功能扩展大型工作负载非常重要。上面的SQL代码片段说明了如何调整存储库的大小。此示例是一个能够处理巨大工作负载的32节点集群。在测试中,由于Snowflake维护了一个可用资源池,因此部署需要几毫秒,在特别繁忙的时期,可能需要几分钟。我们可以简单地让集群在处理完成后300秒(即五分钟)后自动挂起,或者干脆在完成任务后立即挂起集群。如有必要,它可以在需要执行另一个查询时自动恢复。可见整个过程对最终用户的应用程序是透明的。下图是仓库容量不好时的指标,包括溢出到本地存储(虚拟仓库SSD)和远程存储的数据量。在虚拟仓库中,由于本地存储始终是速度很快的SSD,任何无法在内存中完成的大型排序操作都不可避免地会溢出到本地存储中。好吧,如果你看到大量数据溢出到外部存储,这意味着SSD存储已经用完,数据正在写入速度慢得多的S3或Blob存储。可以看出,根据这两个指标,我们应该考虑调整到更大的虚拟仓库,内存更多,本地SSD存储。ScaleOut并发不同于上述的垂直扩展。水平扩展技术用于部署一些相同大小的节点集群来达到目标??并发,即增加用户数量,而不是任务的大小或复杂性。上面的SQL片段显示了部署面向多个集群的横向扩展架构时所需的语句。这种方法不是部署大型主机集群,而是让Snowflake根据需要添加其他相同大小的集群,直到达到预定的上限。我们在下图中展示的是配置BI虚拟仓库,当其他用户执行查询时,自动将集群添加到现有的配置环境中。显然,这与ELT的仓库有很大不同,后者被定义为一个更大的简单集群,用于处理复杂任务中的各种海量数据。这种调整方式已经被英国外卖服务Deliveroo成功应用。2017年,根据终端用户近20TB数据每小时7000多次查询的需求,采用Snowflake的自动化方式对资源进行横向扩展。由于并发用户数在一天的不同时间不断变化,集群自动暂停,Deliveroo只为实际使用的计算资源付费。下图显示其他集群会根据用户使用情况自动添加,不需要时自动挂起。使用数据聚合调整Snowflake由于使用聚合键(clusterkeys)可以最小化分区并提高查询性能,对于一些大数据表(通常超过1TB),设计者应该考虑定义Aggregatekeys以最大化查询性能。为了说明对Snowflake使用聚合调整的性能优势,我们对TPC(TransactionProcessingCouncil)表的STORE_SALES设置了一个基准测试,该表的容量为1.3Tb,存储了近300亿行的销售数据。接下来,我们对表的聚合版本和非聚合版本运行相同的查询,下图显示了两个结果的比较。通过在SS_SOLD_DATE_SK列上放置一个聚合键,并按日期过滤,整个查询的运行速度提高了14倍,并且只扫描了将近1/30的数据。下图进一步说明了Snowflake聚合的效果,其中涉及的数据是在语句中按DATEWHERE过滤后生成的。由于数据是按日期加载的,它们往往会自然地聚集在一起,即同一天的所有数据都属于同一个微分区。但是,如果执行以下SQL语句,Snowflake会将所有销售日期保存在同一个微分区中。当需要时,后台任务会自动对数据进行重新聚类,所使用的计算和处理资源将作为单独的项目计费。由于Snowflake在每个微分区中都有每列的最小值和最大值,所以它可以直接跳过那些根本不符合查询条件的微分区。为了演示此聚合的性能效果,我们创建了一个包含6亿行和16Gb压缩数据的表。该表由唯一键(ORDER_KEY)标识,因此我们将其表示为聚簇键。通过执行上述查询,我??们在6亿行的正中间找到了目标记录,返回时间为88毫秒。如下面的SnowflakeQueryProfiler截图所示,速度的主要原因是查询只扫描了整个16Gb压缩数据中的1.5Mb,除了一个微分区外,它几乎跳过了所有不相关的内容。可以看出,只要使用聚簇键,Snowflake最多可以跳过99.91%的数据,从而避免了与需要维护传统索引相关的任何性能和数据管理开销。结论综上所述,虽然调优Snowflake性能的选项很少,但我们可以通过上述良好实践来最大化查询性能和吞吐量。原标题:SnowflakePerformanceTuning:Top5BestPractices,作者:JohnRyan
