psycopg2: будет ли PostgreSQL хранить копию таблицы на диске, если она исчерпала память - PullRequest
2 голосов
/ 29 марта 2011

Я выполняю следующий запрос на 489 миллионов строк (102 ГБ) на компьютере с 2 ГБ памяти:

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хранить упорядоченный результат и извлекать данные из этой таблицы.

Причина, по которой этот вопрос задается, состоит в том, что выполнение занимает всего 36 минут при ручном запуске с использованием psql, но это заняло более 8 часов (никогда не завершалось)) получить первые 30000 строк, когда запрос был выполнен с использованием psycopg2.

1 Ответ

3 голосов
/ 29 марта 2011
  1. Если вы хотите получить эту таблицу по частям и отсортировать, то вам нужно создать индекс.Каждая выборка должна будет отсортировать всю эту таблицу, если такого индекса не будет.Ваш курсор, вероятно, отсортировал эту таблицу один раз для каждой выбранной строки - ожидание красного гигантского солнца, вероятно, закончится раньше ...
    create index tablename_order_idx on tablename (x, y, z, h, j, l);

  2. Если данные вашей таблицы относительно стабильны, то вам следуетcluster это по этому показателю.Таким образом, данные таблицы будут извлекаться без особого поиска на диске.
    cluster tablename using tablename_order_idx;

  3. Если вы хотите получать данные порциями, вам не следует использовать курсор, так как он будетвсегда работайте по одной строке за раз.Вы должны использовать limit и offset:
    select * from tablename order by x, y, z, h, j, l
    limit 30000 offset 44*30000

...