psycopg2:如果内存耗尽,PostgreSQL会将表的副本存储在磁盘上

时间:2011-03-29 14:49:40

标签: postgresql psycopg2

我在具有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>

1 个答案:

答案 0 :(得分:3)

  1. 如果要按块获取此表并进行排序,则需要创建索引。如果没有这样的索引,每次获取都需要对整个表进行排序。你的光标可能会为每一行提取一次这个表 - 等待红巨星太阳可能会更快结束...
    create index tablename_order_idx on tablename (x, y, z, h, j, l);

  2. 如果您的表数据相对稳定,那么您应该通过此索引cluster。这样就可以获取表数据,而无需在磁盘上进行太多搜索 cluster tablename using tablename_order_idx;

  3. 如果要以块的形式获取数据,则不应使用游标,因为它一次只能处理一行。您应该使用limit and offset
    select * from tablename order by x, y, z, h, j, l
    limit 30000 offset 44*30000