在 Redshift sql 查询中选择表的顶部/底部 50%

Posted

技术标签:

【中文标题】在 Redshift sql 查询中选择表的顶部/底部 50%【英文标题】:Select top/bottom 50% of a table in Redshift sql query 【发布时间】:2020-07-13 20:21:59 【问题描述】:

使用在 Windows Server 2019 上运行的 psql (Postgres 12.3.1)。此服务器有 64 GB 的 RAM,我正在尝试在 Amazon Redshift 数据库上运行以下查询:

psql -h amazon-redshift-database.redshift.amazonaws.com -d DATABASE -U USER -p 5439 -a -c "select * from realy.large_table" -F ',' -o "D:\Program Files\PostgreSQL\12\data\amazon_redshift_download\really.large_table.csv"

它在查询中途出错:“内存不足”。该表包含 458,968,689 行,5 列:varchar(50)、varchar(50)、varchar(50)、integer、timestamp。

MSSQL似乎有以下能力:

"select top 50 percent * from really.large_table ..."

PostgreSQL 有类似的东西吗?如果没有,有没有办法将我的查询分成百分比,以便我可以减少查询的大小/内存消耗?我尝试过性能调整和使用内存更多的服务器,但没有成功。

版本:

psql -h amazon-redshift-database.redshift.amazonaws.com -d DATABASE-U USER -p 5439 -a -c "select version();"
 version
---------------------------------------------------------------------------------------------------------------------------
 PostgreSQL 8.0.2 on i686-pc-linux-gnu, compiled by GCC gcc (GCC) 3.4.2 20041017 (Red Hat 3.4.2-6.fc3), Redshift 1.0.16966
(1 row)

试过了:

select * from really.large_table tablesample (50)
select * from really.large_table tablesample(50)
select * from really.large_table tablesample (50);
select * from really.large_table tablesample(50);
tablesample system (50)
tablesample system(50)
tablesample system (50);
tablesample system(50);
select * from tablesample system (50); <-with above combinations

结果:

ERROR:  syntax error at or near "50"
LINE 1: select * from really.large_table tablesample(50)

【问题讨论】:

在 Postgres 中,您可以使用 select * from really_large_table tablesample (50) - 我不知道 Redshift 是否也支持。 我的尝试见上文。 tablesample system (50)tablesample system (50) 有效吗? 使用在 Windows Server 2019 上运行的 Postgres 12.3.1”与“通过 psql 在 Amazon Redshift 数据库上运行以下查询相矛盾" 那里仍然收到语法错误。编辑了我的原始查询以包含完整的 psql 语法,并澄清了语句。 【参考方案1】:

这不是最理想的解决方案,但它对我有用。

    安装 SQL Workbench/J

    下载并安装 Redshift JDBC 驱动程序:https://docs.aws.amazon.com/redshift/latest/mgmt/connecting-using-workbench.htm

    在管理命令提示符下,使用以下 Java 命令启动 SQL Workbench J(注意:60g = 60GB,设置为您希望它使用的 RAM 量):

    java -Xmx60g -jar sqlworkbench.jar

    当它启动时,将主屏幕上的“获取大小”设置为一些 X:10,000

    连接到您的数据库

    使用 GUI 的数据库浏览器导出数据。

    坐下来等待它下载你的大表

当提取大小受到限制时,它从不消耗太多内存。我相信这是关键的一步,而不是给应用程序更多的内存。

【讨论】:

以上是关于在 Redshift sql 查询中选择表的顶部/底部 50%的主要内容,如果未能解决你的问题,请参考以下文章

在时间范围内达到 Redshift 表的查询数

Redshift 数据库中维度表的排序和分布键选择

SQL(Redshift)获取多个表的交集

带子查询的redshift sql查询中的语法错误

如何运行存储在 Redshift 表中的 SQL 查询

AWS Quicksight,Redshift“引用嵌套表的子查询不能包含 WINDOW 操作”