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

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

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

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

11 ответов

21 просмотр

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, только попроще и без процедур. Вопрос закрыт, спасибо.

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

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

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Ребят в СИ можно реализовать ООП?
Николай
33
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
у вас два процесса. один посылает другому сигнал. у вас есть код обоих процессов? если всё не так - расскажите как оно на самом деле. а именно кто кому чего, есть-ли консоли,...
Karagy
6
Карта сайта