FILLFACTOR
Само с INSERT и SELECT трябва да използвате FILLFACTOR от 100 навсякъде.
Няма смисъл да оставяте място за мърдане на блок памет, ако няма да "мърдате" с UPDATE с.
Механизмът зад FILLFACTOR е много проста. INSERT запълва само всяка страница с данни (обикновено блокове от 8 kb) до процента, деклариран от FILLFACTOR настройка. Също така, когато стартирате VACUUM FULL или CLUSTER на масата се възстановява същата стая за мърдане на блок. В идеалния случай това позволява UPDATE s за съхраняване на нови версии на редове в същата страница с данни, което може да осигури значително повишаване на производителността при работа с много UPDATE с. Също така е полезен в комбинация сH.O.T. актуализации :
Ако не актуализации, не губете място за това и задайте 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 байта средно - обикновено не можете да изстискате много с „тетрис с колона:
Освен това запазете NOT NULL колони в началото на таблицата за много малък бонус за ефективност.
Освен това вашата таблица има 9 колони . Това означава допълнителни 8 байта за разширеното NULL bitmap - което ще се побере в първоначалното 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;