Задать вопрос
@maqstein
Python developer

Что происходит с памятью после удалении записи с типом varchar в postgresql?

я разбирался в чем разница между типами данных char и varchar в postgresql . мне сно , что при апдейте кортежа в varchar запись удаляется с диска и вписывается на новое место в памяти . но что происходит с освободившимся в памяти местом?
остались у меня, наприме, 4 байта в памяти , и что с ними будет происходить? они опять заполнятся строкой в 4 байта?по моему это неэффективно по скорости. Или они просто останутся висеть пустые?

P.s подскажите еще прогу для просмотра занимаемой процессом памяти на жестком диске и оперативке
  • Вопрос задан
  • 62 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 1
Melkij
@Melkij
PostgreSQL DBA
мне сно , при апдейте кортежа в varchar запись удаляется с диска и вписывается на новое место в памяти

Ммм. Сомневаюсь что действительно что-то ясно.

Для начала:
на диске данные существуют ровно в том же виде, что и затем обрабатываются в памяти. Как побочного следствие именно этого, кстати, базы postgresql физически не переносимы на другие процессорные архитектуры, только dump/restore или ещё какую логическую репликацию. А ещё есть забавный фокус выравнивания структур данных в памяти. Из-за чего при разном порядке столбцов в таблице идентичный объём записанных данных может различаться по требуемому месту на дисках.

postgresql - mvcc база. При удалении строки запись не удаляется. Вообще. Только проставляется xmax и страничка отмечается грязной. Операции обновления строки не существует вовсе. Update - это всегда delete + insert. Обновлённая запись при этом попадает в отличающееся место таблицы, так, что в таблице одновременно существую и старая и новая версии строки. И их может быть много.
(enterprisedb грозятся доделать zheap в pg13, так что может будет веселее, но в версиях до 11 гарантированно как я описал, в 12 - только если вы смелый человек и будете собирать экспериментальные расширения)
Итак, далее приходит autovacuum или vacuum, строки которые уже никому не могут быть видны вычищаются и считаются пустым пространством, в том числе по free space map.

Пишущие операции пытаются найти место под запись:
- в той же самой странице данных
- в какой-то странице начиная от начала таблицы
- в худшем случае создают новую страницу

Да, может быть что остались области в датафайлах, в которых ничего нет и даже ничего полезного туда и не поместится.

занимаемой процессом памяти на жестком диске

Что это такое?
Если интересен формат датафайлов - то вам дорога в исходники базы. Для ОС выделяются блоки на диске по 8кб и в них хранится какая-то бинарная штука.

Касательно private памяти backend'а - в postgresql есть менеджер памяти, называемый memory context. backend память запрашивает у ОС блоками, что-то делает что ему надо используя эту память под всякую мелочь или не очень мелочь, затем memory context обнуляется или удаляется и память возвращается ОС. Большинство контекстов существуют не долго, на транзакцию или на запрос, например.
Отладчик широко распространён - gdb. Без dbg сборки, впрочем, там явно будет ничего не понятно.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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