sql >> Database teknologi >  >> RDS >> PostgreSQL

Fyldfaktor for et sekventielt indeks, der er PK

FILLFACTOR

Kun med INSERT og SELECT du skal bruge en FILLFACTOR af 100 overalt.

Det nytter ikke at forlade slingreplads pr. hukommelsesblok, hvis du ikke skal "vrikke" med UPDATE s.

Mekanismen bag FILLFACTOR er meget enkel. INSERT s udfylder kun hver dataside (normalt en 8 kb blokke) op til den procentdel, der er angivet af FILLFACTOR indstilling. Også når du kører VACUUM FULL eller CLUSTER på bordet genetableres det samme vrikkerum pr. blok. Ideelt set tillader dette UPDATE s for at gemme nye rækkeversioner på den samme dataside, hvilket kan give et væsentligt ydelsesboost, når man håndterer mange UPDATE s. Også gavnlig i kombination med H.O.T. opdateringer :

Hvis der er ingen opdateringer, spild ikke plads på dette og indstil FILLFACTOR = 100 .

Grundlæggende informationskilde:manualen om CREATE TABLE eller CREATE INDEX .

Anden optimering

Men du kan gøre noget andet - da du tilsyneladende er en sucker for 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));

Dette optimerer din tabel med hensyn til datajustering og undgår polstring for en typisk 64 bit server og sparer et par bytes, sandsynligvis kun 8 byte i gennemsnit - du kan typisk ikke presse meget ud med "column tetris:

Behold også NOT NULL kolonner i starten af ​​bordet for en meget lille præstationsbonus.

Din tabel har også 9 kolonner . Dette betyder en ekstra 8 bytes for den udvidede NULL bitmap - som ville passe ind i den indledende 1-byte NULL bitmap for kun 8 kolonner .
Hvis du definerer et_mode og token NOT NULL , alle kolonner er NOT NULL og NULL bitmap bruges overhovedet, hvilket frigør 8 bytes.
Dette virker endda pr. række, hvis du ikke erklærer kolonnerne NOT NULL . Hvis alle kolonner har værdier, er der ingen NULL bitmap for denne række. I dit tilfælde fører dette til den paradoksale effekt, at udfyldning af værdier for et_mode og token kan gøre din lagerstørrelse mindre eller i det mindste forblive den samme:

Grundlæggende informationskilde:manualen om databasefysisk lagring .

Sammenlign størrelsen af ​​rækker (fyldt med værdier) med din oprindelige tabel for at få et endeligt bevis:

SELECT pg_column_size(t) FROM dev_transactions t;



  1. Sådan får du streng efter karakter orakel

  2. Vis flere poster i træk

  3. Oracle samme tabelnavn på andet skema?

  4. Hvordan renser og geninstallerer man postgresql på ubuntu?