sql >> Database >  >> RDS >> PostgreSQL

Vulfactor voor een sequentiële index die PK . is

FILLFACTOR

Met alleen INSERT en SELECT gebruik een FILLFACTOR van 100 overal.

Het heeft geen zin om per geheugenblok bewegingsruimte te laten als je niet gaat "wiebelen" met UPDATE v.

Het mechanisme achter FILLFACTOR is heel eenvoudig. INSERT s vul alleen elke gegevenspagina (meestal een blok van 8 kb) tot het percentage dat is aangegeven door de FILLFACTOR instelling. Ook wanneer u VACUUM FULL . uitvoert of CLUSTER op tafel wordt dezelfde bewegingsruimte per blok hersteld. Idealiter staat dit UPDATE . toe s om nieuwe rijversies op dezelfde gegevenspagina op te slaan, wat een aanzienlijke prestatieverbetering kan opleveren bij veel UPDATE s. Ook gunstig in combinatie met H.O.T. updates :

Als er geen . zijn updates, verspil hier geen ruimte voor en stel FILLFACTOR = 100 in .

Basisinformatiebron:de handleiding op CREATE TABLE of CREATE INDEX .

Andere optimalisatie

Maar je kunt iets anders doen - aangezien je een sukkel lijkt te zijn voor optimalisatie ... :)

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

Dit optimaliseert uw tabel met betrekking tot gegevensuitlijning en vermijdt opvulling voor een typische 64-bits server en bespaart een paar bytes, waarschijnlijk gemiddeld slechts 8 bytes - je kunt er meestal niet veel uit persen met "column tetris:

Bewaar ook NOT NULL kolommen aan het begin van de tabel voor een zeer kleine prestatiebonus.

Uw tabel heeft ook 9 kolommen . Dit betekent een extra 8 bytes voor de uitgebreide NULL bitmap - die zou passen in de initiële 1-byte NULL-bitmap voor slechts 8 kolommen .
Als u et_mode definieert en token NOT NULL , alle kolommen zijn NOT NULL en de NULL-bitmap wordt helemaal niet gebruikt, waardoor 8 bytes vrijkomen.
Dit werkt zelfs per rij als u de kolommen niet declareert NOT NULL . Als alle kolommen waarden hebben, is er geen NULL-bitmap voor deze rij. In jouw geval leidt dit tot het paradoxale effect dat het invullen van waarden voor et_mode en token kan uw opslagruimte kleiner maken of in ieder geval hetzelfde blijven:

Basisinformatiebron:de handleiding over fysieke databaseopslag .

Vergelijk de grootte van rijen (gevuld met waarden) met uw originele tabel om definitief bewijs te krijgen:

SELECT pg_column_size(t) FROM dev_transactions t;



  1. PHP bindParam lijkt niet te werken met een PARAM_INT out parameter

  2. Talend hoe de ene db naar de andere te kopiëren

  3. doctrine:schema:update respecteert de kolomvolgorde niet

  4. Voorwaardelijke voorwaarden in SQL Server