PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Фактор на запълване за последователен индекс, който е PK

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;



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Избройте всички външни ключове PostgreSQL

  2. NodeJS и Express:Грешка:самоподписан сертификат

  3. Десетична стойност в Postgresql, върната като низ в Node.js

  4. Функции на Postgres

  5. Защита на ниво ред с помощта на Prisma и Postgres