чтобы вернуть данные только с конкретной страницы данных?
Нечто вроде (для страницы N):
SELECT * FROM table WHERE ctid >= '(N, 0)' AND ctid < '(N+1, 0)'
hexedit ))
Ага, а также pageinspect с его get_raw_page/heap_page_items. Но это не назовёшь эффективным и встроенным средством.
не знаю как в постгресе, но в оракле есть адрес строки rowid, который содержит номер датафайла и блока в нем. Его можно указать при селекте и таким образом выбрать строки из блока. Погуглите, может в постгресе есть что-то аналогичное.
Для этого в PostgreSQL есть аналог в виде ctid, который очень эффективен. Но это пригодится в случае если вам нужно выбрать конкретную строку, а не целый блок.
так ctid содержит адрес страницы?
Содержит. Однако, речь не о том, чтобы получить номер блока. Речь идёт о том, чтобы получить строки которые содержит конкретный блок (т.е. номер блока заранее известен).
https://dba.stackexchange.com/questions/65964/how-do-i-decompose-ctid-into-page-and-row-numbers помоему вот ваше спасение
ctid показывает страницу + смещение в ней, oid+ctid= rowid
Каст tid::text::point эффективным назвать нельзя. Если вы такое добавите к WHERE, то вы получите seq scan по всей таблице. Судя по всему, встроенного средства для этого всё же нет. Только если использовать расширения.
напишите pgpsql процедуру которая транслирует ctid в номер блока и выбирает по одной строке все строки которые удовлетворяют условию вхождения в искомый блок. Пустите цикл инкрементируя ctid в рамках одного блока от строки номер 0 и до того момента пока нечего будет выбирать.
Примерно тоже самое предложил ув. @tzirechnoy, только попроще и без процедур. Вопрос закрыт, спасибо.
Обсуждают сегодня