我在具有2 GB内存的计算机上运行以下有关4.89亿行(102 gb)的查询:
select * from table order by x, y, z, h, j, l;
我正在将psycopg2与服务器游标(“cursor_unique_name”)一起使用,并一次获取30000行。
显然查询的结果不能留在内存中,但我的问题是以下一组查询是否同样快:
select * into temp_table from table order by x, y, z, h, j, l;
select * from temp_table
这意味着我会使用temp_table存储有序结果并从该表中获取数据。
提出这个问题的原因是如果使用psql手动运行只需要36分钟,但是当使用psycopg2执行查询时,需要花费8个多小时(从未完成)来获取前30000行。 / p>
答案 0 :(得分:3)
如果要按块获取此表并进行排序,则需要创建索引。如果没有这样的索引,每次获取都需要对整个表进行排序。你的光标可能会为每一行提取一次这个表 - 等待红巨星太阳可能会更快结束...
create index tablename_order_idx on tablename (x, y, z, h, j, l);
如果您的表数据相对稳定,那么您应该通过此索引cluster
。这样就可以获取表数据,而无需在磁盘上进行太多搜索
cluster tablename using tablename_order_idx;
如果要以块的形式获取数据,则不应使用游标,因为它一次只能处理一行。您应该使用limit
and offset
:
select * from tablename order by x, y, z, h, j, l
limit 30000 offset 44*30000