【问题标题】:Query run in Amazon Redshift runs in my machine's local memory在 Amazon Redshift 中运行的查询在我机器的本地内存中运行
【发布时间】:2015-09-23 23:10:17
【问题描述】:
我正在尝试在 Amazon Redshift 中加入一个相当大的表(大约 1 亿行)。当我使用 SQLWorkbench/J 将命令发送到 Amazon 以将表与引用表连接起来时,它会在我机器的本地内存中运行查询。
我对其进行了一些研究,发现它可能是我机器上的超时设置(MacOSX),所以我按照指示更改了这些设置,但它仍在内存中运行 JOIN 查询,这显然无法处理这么多行。
有人经历过吗?为什么它会在本地内存中运行?
我使用的 SQL 代码是:
SELECT * FROM table1, table2 WHERE table1.ref=table2.ref;
【问题讨论】:
标签:
database
postgresql
amazon-web-services
inner-join
amazon-redshift
【解决方案1】:
它不会在内存中运行连接,sql 将在 redshift 节点上执行。您的问题将是您尝试使用“选择 *”返回 1 亿行。 Sql 工作台将难以呈现这么多数据。
限制你的结果集以减少被渲染的行数,即:
SELECT * FROM table1, table2 WHERE table1.ref=table2.ref limit 100
另外,请确保您的分布和排序键(在您的示例中为参考)在两个表上相同以提高性能
【解决方案2】:
如上所述,您的本地计算机并未运行联接,而是尝试显示结果。我还不能发表评论,但如果您真的需要返回该联接的整个结果集,我想将您引导至 Redshift 的 unload 功能。
在您使用少量数据样本测试您的连接并确认它返回正确的集合后,您可以运行 unload 将查询结果连同一个清单文件转储到您的 s3 目录中,该文件允许您知道创建了哪些文件(如果数据集对于一个文件来说太大):
unload ('SELECT * FROM table1, table2 WHERE table1.ref=table2.ref')
to 's3://YOUR_BUCKET/EXPORT' credentials
'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secret-access-key>'
manifest;
然后您可以根据需要下载文件,而不会让您的 SQL 工作台出现恐慌。