172 похожих чатов

Коллеги, добрый день! Что-то не соображу. Есть ли штатные эффективные средства,

чтобы вернуть данные только с конкретной страницы данных?

Нечто вроде (для страницы N):
SELECT * FROM table WHERE ctid >= '(N, 0)' AND ctid < '(N+1, 0)'

11 ответов

41 просмотр

hexedit ))

Petr- Автор вопроса
Denis
hexedit ))

Ага, а также pageinspect с его get_raw_page/heap_page_items. Но это не назовёшь эффективным и встроенным средством.

Petr
Ага, а также pageinspect с его get_raw_page/heap_p...

не знаю как в постгресе, но в оракле есть адрес строки rowid, который содержит номер датафайла и блока в нем. Его можно указать при селекте и таким образом выбрать строки из блока. Погуглите, может в постгресе есть что-то аналогичное.

Petr- Автор вопроса
Denis
не знаю как в постгресе, но в оракле есть адрес ст...

Для этого в PostgreSQL есть аналог в виде ctid, который очень эффективен. Но это пригодится в случае если вам нужно выбрать конкретную строку, а не целый блок.

Petr
Для этого в PostgreSQL есть аналог в виде ctid, ко...

так ctid содержит адрес страницы?

Petr- Автор вопроса
Denis
так ctid содержит адрес страницы?

Содержит. Однако, речь не о том, чтобы получить номер блока. Речь идёт о том, чтобы получить строки которые содержит конкретный блок (т.е. номер блока заранее известен).

Petr
Содержит. Однако, речь не о том, чтобы получить но...

https://dba.stackexchange.com/questions/65964/how-do-i-decompose-ctid-into-page-and-row-numbers помоему вот ваше спасение

Denis
не знаю как в постгресе, но в оракле есть адрес ст...

ctid показывает страницу + смещение в ней, oid+ctid= rowid

Petr- Автор вопроса
Denis
https://dba.stackexchange.com/questions/65964/how-...

Каст tid::text::point эффективным назвать нельзя. Если вы такое добавите к WHERE, то вы получите seq scan по всей таблице. Судя по всему, встроенного средства для этого всё же нет. Только если использовать расширения.

Petr
Каст tid::text::point эффективным назвать нельзя. ...

напишите pgpsql процедуру которая транслирует ctid в номер блока и выбирает по одной строке все строки которые удовлетворяют условию вхождения в искомый блок. Пустите цикл инкрементируя ctid в рамках одного блока от строки номер 0 и до того момента пока нечего будет выбирать.

Petr- Автор вопроса
Denis
напишите pgpsql процедуру которая транслирует ctid...

Примерно тоже самое предложил ув. @tzirechnoy, только попроще и без процедур. Вопрос закрыт, спасибо.

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта