我设置了一个postgres + nodejs系统,该系统根据用户输入执行查询。由于服务器资源受到限制,我想防止查询结果过大而无法放入RAM或超出我设置的限制。
查询生成可能会有些复杂,具体取决于输入,而我查询的表如下所示:
id | id_something_related | timestamp | varchar32_A | varchar32_B | jsonb_data (with different names of course)
由于表包含jsonb数据(非固定大小),所以我不能使用简单的LIMIT来限制最大行数。
我目前的解决方案是执行第二个查询,该查询封装了第一个查询并返回其大小:
SELECT COALESCE(sum(pg_column_size( _data.* )), 0) as total_size_byte FROM ( ...REAL QUERY HERE.... ) as _data
第一个查询为我提供了一个大小,可以用来决定是否要执行该查询。 与此相对的是,它两次运行查询,这代表了服务器上的大量开销。
我会很高兴:
答案 0 :(得分:1)
这个问题的简单而经典的解决方案是使用游标并一次或批量获取结果。然后,只要超出限制,您就可以停止获取。
任何其他解决方案都将不得不依赖估计,因此不精确。您可以检查EXPLAIN
的查询结果,如this blog post末尾所示。由于不仅要关注行数,而且要关注每行的大小,所以您还希望检索平均结果行的width
(以字节为单位)。
但是我认为使用游标是国王的方式。