Как организовать построчное чтение из очень большой, неизменяемой таблицы?
Имеется очень большая неизменяемая таблица (в память не влезет). Необходимо организовать построчное чтение данной таблицы с разных хостов из 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 оборвет выполнение этой команды на «самом интересном месте» по какой-либо причине.
А это самое «1», «4» итд еще понадобятся когда-нить? А то может можно добавить, например колонку boolean toDelete и в коде демона сделать что-нить а-ля if(offset >=n) delete from...?
Если сканирование идет по индексу, то при OFFSET K LIMIT N будут просканированы первые K+N записей, из них K пропущены, а N отданы клиенту. При WHERE сразу находится нужное место в индексе и сканирование начинается с него.
Я в свое время написал статью про пагинацию в постгресе. Она, конечно, не совсем на ваш вопрос отвечает, но тема OFFSET vs WHERE там раскрыта.
Написано
Войдите на сайт
Чтобы задать вопрос и получить на него квалифицированный ответ.