Redshift 查询输出对于 RAM 来说太大
Posted
技术标签:
【中文标题】Redshift 查询输出对于 RAM 来说太大【英文标题】:Redshift query output too big for RAM 【发布时间】:2021-07-02 12:08:57 【问题描述】:我有一个红移查询,其输出太大而无法放入我的 EC2 实例的 RAM。我正在使用psycopg2
来执行查询。如果我使用限制关键字,如果我增加限制,行会重复吗?
假设我首先执行0,1000
的限制并获得一个块,然后我执行1001,2000
的限制。考虑到 redshift 并行获取数据,这两个块中是否会有重复行?
有没有更好的选择?
【问题讨论】:
您应该始终使用LIMIT
和ORDER BY
。 ORDER BY
应该有唯一定义每一行的键。那么你就不用担心重复了。
首先,您真的需要将它们全部加载到 RAM 中吗?您可以仅通过缓冲和流水线处理所有内容,而无需实际同时加载所有内容。
或者,您可以多次运行查询(假设您添加了ORDER BY
)。但是,如果同时修改数据库,则此策略可能无法正常工作。如果数据被其他进程修改,您的多个查询可能会在结果中出现差距或重复。
我刚刚正确地查看了这个问题;请注意,Redshift 不支持 LIMIT
的行范围。
【参考方案1】:
您希望声明一个游标以将完整结果存储在 Redshift 上,然后根据需要从游标中批量获取行。这样查询只在游标被填满时运行一次。请参阅https://docs.aws.amazon.com/redshift/latest/dg/declare.html(示例在页面底部)。
这正是 Tableau 等 BI 工具从 Redshift 获取数据的方式 - 以 10,000 行为单位。使用游标可以防止工具/系统/网络被数据淹没,因为您可能会选择非常大的结果集。
【讨论】:
但请记住,光标对于 Redshift 来说是个坏消息。整个查询结果生成并存储在领导节点上,直到游标最终将批次传送给客户端。这对集群上的其他人来说是个坏消息,这就是为什么每个会话只能使用一个游标。一般建议是不要使用它们,我个人非常强烈的建议是根本不要在 Redshift 上使用 Tableau(或其他 BI 工具)。 哇。每个查询都将其结果存储在领导节点上,直到它可以通过网络移出。将网络不断推出大量结果会使领导者反应迟钝。唯一更好的是不要通过leader产生大的结果,这会限制你并行卸载。生活充满了选择和工作量。每个人都有权发表自己的意见。 这可以解决我的问题,但不幸的是,我的集群不够大,无法在游标中承载这么多数据。无论如何谢谢@BillWeiner 好的,如果您的结果很大,那么您将需要将数据(并行)卸载到 S3。然后从您的 ec2 实例中解析 S3 对象。以上是关于Redshift 查询输出对于 RAM 来说太大的主要内容,如果未能解决你的问题,请参考以下文章
在 WHERE 字段中使用用户指定变量的 RSQLite 查询 [重复]