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

    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 сборки, впрочем, там явно будет ничего не понятно.
    Ответ написан
    Комментировать
  • Как реализовать квесты в бд для онлайн игры?

    saboteur_kiev
    @saboteur_kiev Куратор тега Разработка игр
    software engineer
    Так вам нужно много табличек.
    Табличка с типами заданий, табличка с ключевыми персонажами, предметами, строками которые фигурируют в задании. Табличка с самими квестами, где для квеста будет перечислены его шаги из заданий и участников, логика квеста (его ветки в зависимости от результата выполнения) а также известный ревард.
    А уже потом табличка со статусом пользователей о прохождении конкретного квеста.
    Ответ написан
    2 комментария