首页 > 解决方案 > SnowSQL 性能极慢

问题描述

我们正在从一个表中运行一个非常简单的选择,这会产生一组大约 1.7 万行的数据。

我们希望我们可以将其导出到共享网络驱动器,但文件写入的性能(查询本身运行大约 3.5 秒)一直很糟糕,在大约 6 小时内返回了 150,000 行。此时,我们的 Okta 身份验证超时,必须更改并重新运行查询以捕获原始运行中未通过的行。

我可以在我的本地运行它,并且整个返回的数据集在大约 15 分钟内愉快地进入输出 csv。

有没有办法可以进一步挖掘这里的延误?有没有其他人遇到过这个问题并能够找到根本原因?

谢谢!

我应该添加我用来参考的命令:

snowsql -c {connection} -f .\source_q.sql -o output_file=c:\users\{username}\desktop\snowsql\output.csv -o quiet=true -o friendly=false -o header=true -o output_format=csv --authenticator externalbrowser

我正在运行的查询如下所示:

select 
   cnt.id, 
   cnt.account_id, 
   cnt.did_c, 
   cnt.okta_id_c     
from 
   MEMBER.CONTACT cnt

为了简单起见,我删除了一些小的 where 子句。

标签: csvsnowflake-cloud-data-platform

解决方案


似乎问题是写入网络驱动器太慢了。c:\users\{username}网络路径对吗?如果您可以毫无问题地写入本地计算机,但网络路径很慢,那么如果不加快网络速度或缩小文件大小,您很可能无法修复。

有帮助的一件事是在上传到网络驱动器之前压缩文件。一个简单的方法是这样的:

snowsql -c {connection} -f .\source_q.sql -o friendly=false -o header=true -o output_format=csv --authenticator externalbrowser | gzip > c:\users\{username}\desktop\snowsql\output.csv

我删除了将 CSV 发送到标准输出的-o output_file=...and-o quiet=true标志,然后在加载到网络位置之前先通过 GZIP 管道传输它。

这种方法显然会在从 Snowflake 下载文件压缩文件,但理想情况下,您希望在下载之前对其进行压缩。你可以这样做:

  1. 使用带有标志的COPY INTO命令compression = gzip,将数据复制到命名内部阶段的文件中
  2. 使用 SNOWSQL 运行GET命令以将文件下载到网络位置

最后一个选项可能是最快的方法,但是它会在内部阶段生成多个文件,因此您必须下载每个文件。无论采用哪种方式,您都应该通过压缩数据看到相当显着的改进。当我对一个有 150,000 条记录的表进行测试时,我的文件大小从 24MB 变成了 9MB。


推荐阅读