【发布时间】:2021-02-16 14:32:53
【问题描述】:
有没有一种很好的方法可以知道 Redshift 中的查询响应大小?
其他提供商创建一个临时表(或者您可以这样做),然后检查表大小。在 Redshift 中,临时表在 svv_table_info 视图中没有条目。
【问题讨论】:
标签: amazon-web-services amazon-redshift
有没有一种很好的方法可以知道 Redshift 中的查询响应大小?
其他提供商创建一个临时表(或者您可以这样做),然后检查表大小。在 Redshift 中,临时表在 svv_table_info 视图中没有条目。
【问题讨论】:
标签: amazon-web-services amazon-redshift
创建临时表确实适合您的情况,所有表的大小可以通过查看 stv_blocklist 找到。由于每个表都由块组成,并且所有块的大小均为 1MB,因此这为表提供了“从马口”大小。请记住,这给出了存储表所需的块,在某些情况下,这可能会产生误导 - DISTSTYLE ALL 表将有 N 个数据副本。一般来说,这是查找任何表格大小的好方法。您还可以查询临时表中的行数以进行不同的大小评估。
临时表方法的缺点是设置数据并将数据组织到表中所需的时间。您仍然需要选择此数据进行输出,假设这是评估大小后的意图。处理潜在的超大输出的一种更常见但更高级的方法是设置一个光标来保存输出。
游标是 Redshift 领导节点上的输出缓冲区,它在传输到请求客户端之前保存查询结果。然后可以按行块(通常为 10,000 个)读取游标内容,当需要更多数据时,读取更多行。许多 BI 工具将使用游标,以便格式错误的报告不会用太多数据淹没工具。您还可以通过查看 stv_active_cursors 来查询游标的大小(行和字节)。
游标的缺点是它们需要领导节点的工作,不多,但有一些。游标的严重过度使用/误用可能会减慢领导者的速度或可能填满领导者节点的磁盘(但这不太可能,因为领导者的磁盘大小与计算节点相同,但要存储的数据不多)。此外,由于游标是在循环中读取的,先获取然后处理,再获取然后处理,客户端通常是应用程序而不是用户。但是,我已经交互地完成了游标,以便在通过网络将其拉出之前查看输出的大小 - 对游标运行查询,读取游标的大小,然后如果大小合适,则将整个游标读入一个块。
底线 - 光标可能是您正在寻找的解决方案(如果没有描述用例,我真的无法判断)。
【讨论】:
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'
cursor: 5.5 table: 12 downloaded JSON file: 4.6cursor: 17 table: 27 downloaded JSON file: 37@ 987654324@cursor: 2196 table: 1249