Всё о GUC по порядку: block_size
Автор: Christophe Pettus, All Your GUCs in a Row: block_size
Параметр, который вы не можете изменить. block_size находится в разделе «Предустановленные параметры» (Preset Options) документации, вместе со своими «кузенами» только для чтения, такими как data_checksums, wal_block_size и server_version. Он сообщает размер страницы PostgreSQL — фундаментальной единицы хранения на диске и учёта в буферном пуле. Значение по умолчанию — 8192 байта. Он доступен только для чтения во время выполнения, может быть установлен только во время компиляции PostgreSQL, а его изменение после создания кластера означает, что нужно начать всё заново с новым кластером.
Так зачем же он вообще в pg_settings? Потому что всё в базе данных измеряется в единицах этого размера.
Что на самом деле означает 8 КБ
shared_buffers = 4 ГБ? Это 524 288 страниц по 8 КБ каждая. pg_class.relpages для таблицы размером 100 МБ? 12 800. Стоимость в EXPLAIN, измеряемая в «обращениях к страницам»? Та же единица. Порог в 1 ГБ для TOAST на ширину строки? Производный от размера блока. Максимальная ширина строки до того, как включается TOAST (~2 КБ)? Одна четверть страницы. Максимальное количество кортежей индекса B-дерева на страницу? Функция размера блока и размера кортежа. Всё в PostgreSQL, на некотором уровне, представляет собой целочисленное количество страниц, а страница имеет размер 8 КБ.
Вот почему этот параметр находится в pg_settings. Инструменты, расширения и операторы должны знать, в каких единицах они работают. Параметр раскрывает ответ.
Когда вы могли бы захотеть его изменить
На практике: никогда. В теории:
- Более крупные блоки (16 КБ, 32 КБ) означают меньше страниц на отношение, меньше уровней индекса, лучшее пакетирование последовательного ввода-вывода и меньшие накладные расходы на учёт на страницу. Некоторые аналитические форки PostgreSQL поставляются со значением по умолчанию 32 КБ именно по этим причинам. Цена — больше потраченного впустую пространства на частично заполненных страницах, более высокий порог TOAST (более длинные строки остаются внутри строки, что иногда помогает, а иногда вредит) и несовместимость с каждым стандартным пакетом PostgreSQL, настройкой репликации и инструментом резервного копирования, которые вы могли бы захотеть использовать.
- Меньшие блоки (1 КБ, 2 КБ, 4 КБ) в основном представляют исторический интерес. Они были полезны, когда сектора дисков были маленькими, а памяти было мало. Сегодня они не дают практически никаких преимуществ и создают много дополнительных накладных расходов.
Допустимые значения, согласно --with-blocksize на этапе компиляции: 1, 2, 4, 8, 16 и 32 КБ. Значение по умолчанию было 8 КБ на протяжении всей истории PostgreSQL, которую кто-либо из читающих вероятно помнит.
Почему почти никто его не меняет
Три причины, по нарастающей серьёзности:
- Это время компиляции. Пакеты дистрибутивов (Debian, Red Hat, EDB, RDS, Aurora) поставляются с 8 КБ. Изменение означает компиляцию PostgreSQL самостоятельно и отказ от управления пакетами.
- Это несовместимо со всем. Вы не можете обновить кластер 8 КБ до кластера 32 КБ на месте. Вы не можете выполнять потоковую репликацию между кластерами с разными размерами блоков.
pg_dump/pg_restoreработает, но это ваш единственный путь миграции, и ваши инструменты должны его поддерживать. - Расширения предполагают 8 КБ. Многие расширения жёстко кодируют предположения о размере страницы, расположении кортежей или поведении TOAST. Чем дальше вы отклоняетесь от значения по умолчанию, тем интереснее становится матрица совместимости ваших расширений.
Рекомендация: Посмотрите на значение. Убедитесь, что оно равно 8192. Двигайтесь дальше. Параметр block_size существует для того, чтобы инструменты мониторинга, планировщики запросов и операторы могли знать единицу измерения, в которой они работают, — а не для того, чтобы вы могли его изменить. Если вы действительно хотите другое значение, вы занимаетесь чем-то достаточно специализированным, и эта статья в блоге — не то место, где вы должны получать советы.
Trackbacks
The author does not allow comments to this entry
Comments
Display comments as Linear | Threaded