【问题标题】: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 工作台出现恐慌。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-04
        • 2019-02-12
        • 1970-01-01
        相关资源
        最近更新 更多