Size: a a a

pgsql – PostgreSQL

2021 February 19

ВТ

Виктор Ткаченко... in pgsql – PostgreSQL
Nikolay
Когда читается блок данных индекса с диска. он "перекладывается" в какую-то структуру в памяти? или база так и работает с ним, как частью файла?
shared_buffers
источник

AL

Alexey Lesovsky in pgsql – PostgreSQL
Nikolay
Когда читается блок данных индекса с диска. он "перекладывается" в какую-то структуру в памяти? или база так и работает с ним, как частью файла?
да, блок перекладывается в структуру которая находится в shared buffers.
подробнее см. тут  https://www.postgresql.org/docs/current/storage-page-layout.html
источник

AL

Alexey Lesovsky in pgsql – PostgreSQL
коротко и схематично тут 8.1.3
http://www.interdb.jp/pg/pgsql08.html
источник

N

Nikolay in pgsql – PostgreSQL
спасибо. читаю. но это ведь лишние затраты. мы считали. переложили все в память(т.е тратим на копировании). потом что-то в памяти пришлось изменить(скажем 1 байт) и мы вынуждены переписать на блок весь диск в 8К полностью!
источник

T

Timofey in pgsql – PostgreSQL
возможно ли обновить сразу несколько jsonb полей со ссылкой на эти поля в запросе ?
источник

AL

Alexey Lesovsky in pgsql – PostgreSQL
Nikolay
спасибо. читаю. но это ведь лишние затраты. мы считали. переложили все в память(т.е тратим на копировании). потом что-то в памяти пришлось изменить(скажем 1 байт) и мы вынуждены переписать на блок весь диск в 8К полностью!
если у вас есть идеи как сделать постгрес лучше, вы можете отправить свои предложения в список рассылки pgsql-hackers
источник

AL

Alexey Lesovsky in pgsql – PostgreSQL
а вобще там все чуть немного сложнее и есть разные ситуации где нет совершенно оптимального поведения для всех случаев
источник

AL

Alexey Lesovsky in pgsql – PostgreSQL
виртуальная память линукса оперирует только страницами по 4KB,
блочные устройства в зависимости оттипа устройства тоже оперируют блоками разных фиксированных размеров и т.д.
источник

AL

Alexey Lesovsky in pgsql – PostgreSQL
> переложили все в память(т.е тратим на копировании). потом что-то в памяти пришлось изменить(скажем 1 байт) и мы вынуждены переписать на блок весь диск в 8К полностью

это не всегда так... в общих чертах, постгрес пишет на диск только WAL журнал, а то что касается data файлов, их изменение происходит в shared buffers и сбрасывается на диск только при контрольных точках (checkpoints). но опять жэ это в общих чертах... все может отличаться от типа таблиц (обычные, временные, unlogged), настроек постгреса, настроек системы
источник

AL

Alexey Lesovsky in pgsql – PostgreSQL
вторую ссылку что я вам скинул, эту книуг лучше прочитать полностью, чтобы иметь более полное представление об устройстве постгреса
источник

N

Nikolay in pgsql – PostgreSQL
спасибо. пока мне непонятно можно ли было сделать иначе. с одной стороны все логично. считали блок. положили его в памяти в другую структуру. и когда надо переписали старое место в файле полностью. альтернатива тут какая? не создавать дополнительных структур и работать напрямую с куском файла. например у меня есть индекс из 16 блоков. вот я прочел корень с диска. у меня же все равно там в двоичном формате все лежит. мне нужно десерелиазовать.
источник

ВТ

Виктор Ткаченко... in pgsql – PostgreSQL
Nikolay
спасибо. пока мне непонятно можно ли было сделать иначе. с одной стороны все логично. считали блок. положили его в памяти в другую структуру. и когда надо переписали старое место в файле полностью. альтернатива тут какая? не создавать дополнительных структур и работать напрямую с куском файла. например у меня есть индекс из 16 блоков. вот я прочел корень с диска. у меня же все равно там в двоичном формате все лежит. мне нужно десерелиазовать.
shared_buffers вроде хранит данные в том же виде, что и на диске
источник

AN

Alexander Nikitin in pgsql – PostgreSQL
Alexey Lesovsky
> переложили все в память(т.е тратим на копировании). потом что-то в памяти пришлось изменить(скажем 1 байт) и мы вынуждены переписать на блок весь диск в 8К полностью

это не всегда так... в общих чертах, постгрес пишет на диск только WAL журнал, а то что касается data файлов, их изменение происходит в shared buffers и сбрасывается на диск только при контрольных точках (checkpoints). но опять жэ это в общих чертах... все может отличаться от типа таблиц (обычные, временные, unlogged), настроек постгреса, настроек системы
+ фоновая запись?
источник

AL

Alexey Lesovsky in pgsql – PostgreSQL
> положили его в памяти в другую структуру. и когда надо переписали старое место в файле полностью.

вот в этом месте, непосредственно после изменения в памяти переписывания в файле не происходит - эта работа асинхронная и перекладывается на контрольную точку, когда все накопившиеся изменения из памяти (shared buffers) едут на диск
источник

ВТ

Виктор Ткаченко... in pgsql – PostgreSQL
Nikolay
спасибо. пока мне непонятно можно ли было сделать иначе. с одной стороны все логично. считали блок. положили его в памяти в другую структуру. и когда надо переписали старое место в файле полностью. альтернатива тут какая? не создавать дополнительных структур и работать напрямую с куском файла. например у меня есть индекс из 16 блоков. вот я прочел корень с диска. у меня же все равно там в двоичном формате все лежит. мне нужно десерелиазовать.
Плюс ко всему прочему читать все время с диска, при конкурентном доступе плохая идея. Система то не под монопольную работу рассчитана.
Кроме того, что несколько клиентов спрашивает, так еще и сам постгрес подходящие вещи расспаралеливает
источник

N

Nikolay in pgsql – PostgreSQL
Виктор Ткаченко
shared_buffers вроде хранит данные в том же виде, что и на диске
но на диске ведь они в последовательности байт. тогда это должен быть массив байт?
источник

AL

Alexey Lesovsky in pgsql – PostgreSQL
блин написал такую портянку текста... потом понял что пересказываю interdb.jp 😂
вобщем прочитайте её на предстоящих выходных - многие вопросы отпадут сами собой
источник

N

Nikolay in pgsql – PostgreSQL
Alexey Lesovsky
блин написал такую портянку текста... потом понял что пересказываю interdb.jp 😂
вобщем прочитайте её на предстоящих выходных - многие вопросы отпадут сами собой
эх. жаль портянку стерли (.
источник

N

Nikolay in pgsql – PostgreSQL
источник

ВТ

Виктор Ткаченко... in pgsql – PostgreSQL
Nikolay
но на диске ведь они в последовательности байт. тогда это должен быть массив байт?
Да. Щас сразу найти не могу. Где то тема была про параллельное сканирование индекса, когда он сканируется в многопоток и у нескольких потоков результат ссылается на одни и те же блоки данных и оптимизируется соответственно путем помещения в shared_buffers в первозданном виде
источник