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

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

  1. 使用 S3 中的文件创建外部表,并从外部表加载(“INSERT INTO.... SELECT...”)到 Snowflake 目标。
  2. 将数据从 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...”适用于外部表。

标签: snowflake-cloud-data-platform


【解决方案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 基础设施中的位置

希望这有帮助吗?

【讨论】:

    猜你喜欢
    • 2010-10-12
    • 1970-01-01
    • 1970-01-01
    • 2019-12-05
    • 2023-03-24
    • 2019-05-30
    • 2020-06-03
    • 2020-04-10
    • 2022-01-22
    相关资源
    最近更新 更多