sql >> Databasteknik >  >> RDS >> PostgreSQL

Fyllningsfaktor för ett sekventiellt index som är PK

FILLFACTOR

Med endast INSERT och SELECT du bör använda en FILLFACTOR av 100 överallt.

Det är ingen idé att lämna rörelseutrymme per minnesblock om du inte ska "vicka" med UPDATE s.

Mekanismen bakom FILLFACTOR är väldigt enkelt. INSERT s fyller bara varje datasida (vanligtvis ett 8 kb-block) upp till den procentandel som anges av FILLFACTOR miljö. Dessutom, när du kör VACUUM FULL eller CLUSTER på bordet återupprättas samma vickningsrum per block. Helst tillåter detta UPDATE s för att lagra nya radversioner på samma datasida, vilket kan ge en avsevärd prestandahöjning när man hanterar många UPDATE s. Även fördelaktigt i kombination med H.O.T. uppdateringar :

Om det finns ingen uppdateringar, slösa inte utrymme på detta och ställ in FILLFACTOR = 100 .

Grundläggande informationskälla:manualen om CREATE TABLE eller CREATE INDEX .

Annan optimering

Men du kan göra något annat - eftersom du verkar vara en sugen på optimering ... :)

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));

Detta optimerar din tabell med avseende på datajustering och undviker stoppning för en typisk 64-bitars server och sparar några byte, förmodligen bara 8 byte i genomsnitt - du kan vanligtvis inte pressa ut mycket med "column tetris:

Behåll också NOT NULL kolumner i början av tabellen för en mycket liten prestationsbonus.

Din tabell har också 9 kolumner . Detta innebär ytterligare 8 byte för den utökade NULL-bitmappen - som skulle passa in i den initiala 1-byte NULL-bitmappen för bara 8 kolumner .
Om du definierar et_mode och token NOT NULL , alla kolumner är NOT NULL och NULL-bitmappen används överhuvudtaget, vilket frigör 8 byte.
Detta fungerar till och med per rad om du inte deklarerar kolumnerna NOT NULL . Om alla kolumner har värden finns det ingen NULL-bitmapp för den här raden. I ditt fall leder detta till den paradoxala effekten att fylla i värden för et_mode och token kan göra din lagringsstorlek mindre eller åtminstone förbli densamma:

Grundläggande informationskälla:handboken om fysisk databaslagring .

Jämför storleken på rader (fyllda med värden) med din ursprungliga tabell för att få definitiva bevis:

SELECT pg_column_size(t) FROM dev_transactions t;



  1. Använder MySQL relationsdatabaser på Gentoo

  2. MySql-fråga för att hämta värdet på elementattributet för xml

  3. 'OPTION SQL_SELECT_LIMIT=DEFAULT'

  4. Förstå PostgreSQL-frågeprestanda