Коэффициент заполнения для последовательного индекса, который является PK
Да, коэффициент заполнения снова. Я провожу много часов за чтением и не могу решить, какой из факторов лучше для каждого случая. Проблема в том, что я не понимаю, когда и как производится фрагментация. Я перемещаю базу данных с MS SQL Server на PostgreSQL 9.2.
Случай 1) 10-50 вставок / минуту в последовательном (последовательном) ПК, 20-50 чтений / час.
CREATE TABLE dev_transactions
(
transaction_id serial NOT NULL,
transaction_type smallint NOT NULL,
moment timestamp without time zone NOT NULL,
gateway integer NOT NULL,
device integer NOT NULL,
controler smallint NOT NULL,
token integer,
et_mode character(1),
status smallint NOT NULL,
CONSTRAINT pk_dev_transactions PRIMARY KEY (transaction_id)
)
WITH (
OIDS=FALSE
);
Случай 2) Аналогичный структурный индекс для последовательной записи PK будет записывать в блоках (один выстрел) ~50 000 регистров каждые 2 месяца, показания 10-50 / мин.
Коэффициент заполнения 50% означает, что при каждой вставке будет создаваться новая страница и переноситься 50% существующих записей на новую страницу создания?
Коэффициент заполнения 50% означает, что при создании новой страницы скопированные записи будут сэкономлены, чтобы избежать вставки между ними?
Новая страница генерируется только если нет места для размещения вставленной записи?
Как видите, я очень смущен; Я был бы признателен за помощь - возможно, это хорошая ссылка для чтения о PostgreSQL и коэффициентах заполнения индекса.
1 ответ
FILLFACTOR
Только с INSERT
а также SELECT
Вы должны использовать FILLFACTOR
из 100
везде.
Нет смысла оставлять пространство для маневра в блоке памяти, если вы не собираетесь "шевелиться" UPDATE
s.
Механизм позади FILLFACTOR
очень просто INSERT
s заполняют только каждую страницу данных (обычно блоки по 8 КБ) до процента, объявленного FILLFACTOR
установка. Кроме того, всякий раз, когда вы запускаете VACUUM FULL
или же CLUSTER
на столе одна и та же комната для маневра восстанавливается. В идеале это позволяет UPDATE
s для хранения новых версий строк на одной странице данных, что может существенно повысить производительность при работе с большим количеством UPDATE
s. Также полезно в сочетании с горячими обновлениями:
Если обновлений нет, не тратьте на это место и установите FILLFACTOR = 100
,
Основной источник информации: руководство по CREATE TABLE
или же CREATE INDEX
,
Другая оптимизация
Но вы можете сделать что-то еще - так как вы, кажется, лох для оптимизации...:)
CREATE TABLE dev_transactions
( transaction_id serial PRIMARY KEY,
gateway integer NOT NULL,
moment timestamp NOT NULL,
transaction_type smallint NOT NULL,
status smallint NOT NULL,
device integer NOT NULL,
controler smallint NOT NULL,
token integer,
et_mode character(1));
Это оптимизирует вашу таблицу с точки зрения выравнивания данных и позволяет избежать заполнения для типичного 64-битного сервера и экономит несколько байт, возможно, в среднем всего 8 байт - как правило, вы не можете сильно выжать с помощью столбца tetris:
Кроме того, держать NOT NULL
столбцы в начале таблицы для очень маленького бонуса производительности.
Кроме того, ваша таблица имеет 9 столбцов. Это означает дополнительные 8 байтов для расширенного растрового изображения NULL, которое вписалось бы в начальное 1-байтовое растровое изображение NULL всего для 8 столбцов.
Если вы определите et_mode
а также token
NOT NULL
все столбцы NOT NULL
и битовая карта NULL используется вообще, освобождая 8 байтов.
Это даже работает для каждой строки, если вы не объявляете столбцы NOT NULL
, Если все столбцы имеют значения, для этой строки нет растрового изображения NULL. В вашем случае это приводит к парадоксальному эффекту, что заполнение значений для et_mode
а также token
может уменьшить размер хранилища или, по крайней мере, остаться прежним:
Основной источник информации: руководство по базам данных физического хранения.
Сравните размер строк (заполненных значениями) с исходной таблицей, чтобы получить окончательное доказательство:
SELECT pg_column_size(t) FROM dev_transactions t;