AWS Redshift 中的查询结果大小
Posted
技术标签:
【中文标题】AWS Redshift 中的查询结果大小【英文标题】:Query result size in AWS Redshift 【发布时间】:2021-02-16 14:32:53 【问题描述】:有没有一种很好的方法可以知道 Redshift 中的查询响应大小?
其他提供商创建一个临时表(或者您可以这样做),然后检查表大小。在 Redshift 中,临时表在 svv_table_info 视图中没有条目。
【问题讨论】:
【参考方案1】:创建临时表确实适合您的情况,所有表的大小可以通过查看 stv_blocklist 找到。由于每个表都由块组成,并且所有块的大小均为 1MB,因此这为表提供了“从马口”大小。请记住,这给出了存储表所需的块,在某些情况下,这可能会产生误导 - DISTSTYLE ALL 表将有 N 个数据副本。一般来说,这是查找任何表格大小的好方法。您还可以查询临时表中的行数以进行不同的大小评估。
临时表方法的缺点是设置数据并将数据组织到表中所需的时间。您仍然需要选择此数据进行输出,假设这是评估大小后的意图。处理潜在的超大输出的一种更常见但更高级的方法是设置一个光标来保存输出。
游标是 Redshift 领导节点上的输出缓冲区,它在传输到请求客户端之前保存查询结果。然后可以按行块(通常为 10,000 个)读取游标内容,当需要更多数据时,读取更多行。许多 BI 工具将使用游标,以便格式错误的报告不会用太多数据淹没工具。您还可以通过查看 stv_active_cursors 来查询游标的大小(行和字节)。
游标的缺点是它们需要领导节点的工作,不多,但有一些。游标的严重过度使用/误用可能会减慢领导者的速度或可能填满领导者节点的磁盘(但这不太可能,因为领导者的磁盘大小与计算节点相同,但要存储的数据不多)。此外,由于游标是在循环中读取的,先获取然后处理,再获取然后处理,客户端通常是应用程序而不是用户。但是,我已经交互地完成了游标,以便在通过网络将其拉出之前查看输出的大小 - 对游标运行查询,读取游标的大小,然后如果大小合适,则将整个游标读入一个块。
底线 - 光标可能是您正在寻找的解决方案(如果没有描述用例,我真的无法判断)。
【讨论】:
哇,谢谢比尔,惊人的反应。我要检查两个 关于临时表,它们不会出现在 STV_BLOCKLIST 或 SVV_DISKUSAGE 视图中。也许是因为这些视图只对超级用户可见,但它适用于非临时表。这是我正在做的查询SELECT count(stv_blocklist.*) as size FROM stv_blocklist, stv_tbl_perm WHERE stv_blocklist.tbl = stv_tbl_perm.id AND stv_blocklist.slice = stv_tbl_perm.slice AND stv_tbl_perm.name = 'MY_TEMP_TABLE_NAME'
光标一个正在工作,但大小与 svv_table_info 视图中的大小相差甚远。对于 50MB 以下的表,游标大小是表信息视图的一半。对于超过 300MB 的表,游标更大。也许我没有测试足够大的表,但到目前为止,光标总是返回所有行的总大小,即使你只要求几行,这对我们来说很好。
作为记录,一些数字检查 svv_table_info 视图(表)和 STV_ACTIVE_CURSORS 视图(光标),MB:cursor: 5.5 table: 12 downloaded JSON file: 4.6
cursor: 17 table: 27 downloaded JSON file: 37
@ 987654324@cursor: 2196 table: 1249
Redshift 中的表由 1MB 的压缩块组成。游标是即将输出的结果数据的缓冲区。如果表在表中,则表的第一行每列将占用 1MB,但只有表示游标数据所需的字节。但是,当数据变大时,Redshift 列压缩可以节省大量空间。对于 JSON,它是一种空间效率极低的数据表示,因为每个“行”的标头信息都是重复的。你的数据对我来说很有意义。苹果、葡萄和西瓜。以上是关于AWS Redshift 中的查询结果大小的主要内容,如果未能解决你的问题,请参考以下文章
AWS Redshift - 在卸载到 s3 时设置零件大小