Задать вопрос

Как организовать построчное чтение из очень большой, неизменяемой таблицы?

Имеется очень большая неизменяемая таблица (в память не влезет). Необходимо организовать построчное чтение данной таблицы с разных хостов из C\C++ кода (хотя код не важен).
Например на сервере имеем

id
===
1
4
6
87

Хост 10.0.0.1 делает запрос, получает 1. Хост 10.0.0.3 делает два запроса, получает 4, 6. И т.д.

PS: На данный момент реализован демон, который висит на стороне сервера, делает запросы вида «SELECT id FROM table ORDER BY(id) OFFSET K LIMIT N», чтобы наполнять внутренний буфер, из которого раздает ответы запрашивающим хостам. С определенного K вся эта балалайка начинает тормозить.

Не может быть, чтобы такая простая задача не имела простого решения штатными средствами Postgres…

UPD: Была идея в демоне выполнять команду «COPY table(id) to STDOUT» и «подсасывать» из нее данные в буфер. Но есть страх, что postgres оборвет выполнение этой команды на «самом интересном месте» по какой-либо причине.
  • Вопрос задан
  • 4818 просмотров
Подписаться 3 Оценить 3 комментария
Ответ пользователя Александр Коротков К ответам на вопрос (7)
smagen
@smagen
Руководитель разработки Postgres Professional
Ещё можно делать так:
SELECT id FROM table WHERE id > последний_прочитанный_в_прошлый_раз_id ORDER BY(id) LIMIT N

Тогда при сканировании по индексу не придется каждый раз пропускать кучу записей, а можно будет начать сразу с нужного места.
Ответ написан