在 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%的主要内容,如果未能解决你的问题,请参考以下文章