通过ODBC从SSIS加载2000万条记录到SNOWFLAKE

loading 20 million records from SSIS to SNOWFLAKE through ODBC

我正在尝试使用 ODBC 连接将大约 2000 万条记录从 ssis 加载到雪花,此加载需要很长时间才能完成。有什么比使用 ODBC 更快的方法吗?我可以考虑将其加载到平面文件中,然后使用平面文件加载到雪花中,但确定该怎么做。

更新: 我使用 bcp 生成了一个文本文件,并使用 ODBC 连接将该文件放在雪花暂存器上,然后使用复制到命令将数据加载到表中。

问题:生成的 txt 文件是一个 2.5gb 的文件,ODBC 正在努力将文件发送到雪花阶段,这部分有什么帮助吗??

将压缩对象写入云提供商的对象存储(AWS S3、Azure blob 等)然后 COPY INTO Snowflake 应该会更快。但也更复杂。

对于 20,000,000 次数据库调用,您碰巧不是一次写一行?

生成文件,然后使用 Snow CLI 将其放入内部 Stage。使用 Cooy into for stage->table。一些编码要做,你永远无法避免通过网络传输 GB,但是 Put coukd 压缩并以块的形式传输文件

ODBC在这样的数据库上很慢,Snowflake(和类似的柱状仓库)也想吃碎片文件,而不是单个大文件。您的原始方法的问题是,在设计用于跨切碎暂存文件并行加载节点的系统上,ODBC 使用的任何方法都不会特别快。

你的第二种方法的问题是没有切碎。具有头节点(例如 Netezza)的非列式数据库会喜欢并吞噬和粉碎您的单个文件,但 Snowflake 或 Redshift 基本上会将其作为单个线程摄取到单个节点中。因此,您摄取单个 2.5 GB 文件在 XS 1 节点雪花上将花费与 L 8 节点雪花集群相同的时间。您的单个节点本身并没有饱和,并且有足够的 CPU 周期空闲,什么都不做。 Snowflake 似乎在一个节点的基础上使用多达 8 个写入线程来进行提取或摄取操作。你可以在这里看到一些测试:https://www.doyouevendata.com/2018/12/21/how-to-load-data-into-snowflake-snowflake-data-load-best-practices/

我的建议是制作至少 8 个文件大小 (2.5 GB / 8),或大约 8 315MB 文件。对于 2 节点,至少 16。尽管作为奖励,如果出现任何问题,它会将您的数据分解成更简单的一口大小的进程 abort/resume/etc。

另请注意,一旦数据被批量插入到 Snowflake 中,就不太可能将其放置在最佳位置以利用微分区的优势 - 因此我建议使用加载的数据重建 table数据并至少在经常受限的列上对其进行排序,即。事实上 table 我至少会重建并按日期排序。 https://www.doyouevendata.com/2018/03/06/performance-query-tuning-snowflake-clustering/