来自 S3(COPY) 的雪花负载数据与来自外部表的负载

Posted

技术标签:

【中文标题】来自 S3(COPY) 的雪花负载数据与来自外部表的负载【英文标题】:Snowflake load data from S3(COPY) vs load from EXTERNAL table 【发布时间】:2020-09-17 06:26:34 【问题描述】:

以下两种情况在性能上有什么区别,其中一种在执行和存储方面进行了成本优化。

    使用 S3 中的文件创建外部表,并从外部表加载(“INSERT INTO.... SELECT...”)到 Snowflake 目标。 将数据从 S3 加载到临时表,然后从临时表加载(“INSERT INTO.... SELECT...”)到 Snowflake 目标。

【问题讨论】:

嗨 - 你能澄清一下临时表是什么意思吗?这个临时表在哪里,您如何将数据加载到其中?当您说“load(INSERT)”时,您的意思是使用“INSERT INTO.... SELECT...”语句还是使用“COPY INTO...”语句? 使用 COPY 命令将数据加载到 Snowflake 中的 TEMP 表中,然后使用“INSERT INTO.... SELECT...”命令进行数据加载。如果还需要任何澄清,请告诉我。 COPY 在 Snowflake 中比 INSERT 快得多。但是,我不会使用您列出的两个选项中的任何一个。为什么不直接将 S3 文件复制到目标表中?您考虑创建外部/临时表是否有特定原因? 是的,有一个特定的原因,想要从不同的源(S3、Azure Gen2、Google 存储)下推逻辑(加入、过滤器、聚合器、函数)。您能否分享一些见解 EXTERNAL 表是如何工作的,它是否使用任何临时存储?因为“INSERT INTO.... SELECT...”适用于外部表。 【参考方案1】:

好的 - 如果您想尽可能多地使用 Snowflake 平台的强大功能(下推优化),那么您需要先尽可能高效地将数据导入 Snowflake,然后针对它运行 SQL 查询((加入,过滤器、聚合器等)。使用 COPY 将您的 S3/Azure/Google 文件移动到 Snowflake 表中,然后针对这些运行 INSERT...SELECT。

没有理由创建 EXTERNAL 表,如果这样做,它的性能将比我建议的方法差得多。

外部表 - 简短说明

为简单起见,我们假设您的 Snowflake 实例在 AWS 上运行,并且您在 S3 存储桶中也有一些文件。

您的所有 Snowflake 数据都由 Snowflake 存储在 S3 中,但格式经过高度压缩和优化。 Snowflake 包含有关您的数据在哪里以及是什么的元数据,可以将您的数据显示为表格/列。

外部表基本上完全相同:Snowflake 保存有关 S3 存储桶中文件的元数据,允许它以表/列的形式呈现数据。区别在于:

外部数据未经过压缩/优化,因此占用更多存储空间且查询速度较慢 实际上,外部表的查询引擎是 S3 环境(除非/直到 Snowflake 已将数据读入内存/缓存,然后它可以像处理 Snowflake 数据一样处理它) 可能存在某些网络延迟因素 - 取决于您的 Snowflake 账户和 S3 存储桶在全球 AWS 基础设施中的位置

希望这有帮助吗?

【讨论】:

以上是关于来自 S3(COPY) 的雪花负载数据与来自外部表的负载的主要内容,如果未能解决你的问题,请参考以下文章

外部表的用例?

雪花 CDC 从 S3 到雪花

查看来自 Snowflake 外部的查询

雪花外部表:添加新列

来自空 S3 分区的 Redshift COPY

COPY INTO 雪花命令的语法错误