Что такое вздутие таблицы в базах данных?


9

Может кто-нибудь объяснить, что вздутие живота означает в терминах базы данных? Например, что значит сказать, что индекс раздут. Я пытался найти его, но нет объяснения, что такое вздутие живота, только то, что оно вызывает или чем оно вызвано.

Ответы:


16

Благодаря тому, как PostgreSQL обрабатывает транзакции и параллелизм, MVCC - Multi-Version Concurrency Control, вы можете получить раздувание. В PostgreSQL, когда вы делаете UPDATEили DELETE, строка фактически не удаляется физически. Для a DELETE, он просто помечает строку как недоступную для будущих транзакций, а для UPDATE, под капотом, она комбинируется INSERTтогда DELETE, когда предыдущая версия строки помечается как недоступная.

Пока данные помечены как недоступные, они все еще там, и пространство не может быть использовано. Чтобы затем пометить пространство как доступное для использования базой данных, необходимо выполнить вакуумный процесс за операциями и отметить это пространство, доступное для использования базой данных. Однако он не возвращается в операционную систему. Это происходит только тогда, когда на целой странице нет активных строк, что может быть необычно в некоторых рабочих нагрузках. Это может быть полезно для некоторых рабочих нагрузок, поскольку вы можете просто обновить пространство на отдельных страницах внутри файлов данных, не добавляя дополнительные файлы данных.

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

Вы можете восстановить пространство с помощью pg_reorg , pg_repack , CLUSTERили VACUUM FULL. Это будет проходить и реорганизовывать файлы, перемещая кортежи и реорганизовываясь, чтобы убедиться, что нет мертвых кортежей, которые устранят раздувание.

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

Вы можете использовать запросы в PostgreSQL Wiki, относящиеся к Show Bloat Database и Index Bloat, чтобы определить, сколько у вас раздувания, и оттуда сделать небольшой анализ производительности, чтобы увидеть, есть ли у вас проблемы с количеством раздувания в ваших таблицах. ,


-1

Это, вероятно, относится к общим проблемам с индексами, когда в индекс добавляется два или несколько столбцов или в таблице есть перекрывающиеся индексы. То есть несколько индексов с одинаковым набором столбцов в них (что делает один из них ненужным). Я бы просмотрел все индексы в таблицах, чтобы найти перекрывающиеся столбцы, найти индексы, которые являются просто подмножествами других индексов, и удалить их, ЕСЛИ вы можете определить, что они не используются.

Кроме того, по мере обновления данных в таблицах индексы могут стать фрагментированными, что приводит к их увеличению, чем это необходимо. Я не знаком с postgres, но подозреваю, что существуют методы дефрагментации индексов (путем перестроения индексов), которые уменьшают их размер на диске.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.