Sto cercando di capire come l'ordine delle colonne minimizzi le dimensioni della tabella in PostgreSQL.Calcola la dimensione della tupla
Esempio:
CREATE TABLE test (
column_1 int
,column_2 int
,column_3 bigint
,column_4 bigint
,column_5 text
,column_6 text
,column_7 numeric(5,2)
,column_8 numeric(5,2)
,column_9 timestamp
,column_10 boolean
,column_11 boolean
);
INSERT INTO test
VALUES(1,1,1,1,'test','test_1',12,12,current_timestamp,true,false);
SELECT pg_column_size(test.*) FROM test;
pg_column_size
----------------
82
(1 row)
Il formato tupla:
23 byte overhead tupla intestazione + 1 byte per NULL bitmap, quindi:
24 + 4 + 4 + 8 + 8 + 5 + 7 + 5 + 5 + 8 + 1 + 1 = 80 ma la dimensione effettiva della tupla è 82.
Esiste un sovraccarico extra di 2 byte?
ho capito l'esempio riportato sopra sotto il collegamento:
Calculating and saving space in PostgreSQL
Se togliamo l'column_8 numeric(5,2)
quindi anche la dimensione tupla rimane la stessa, cioè: 82.
ho riordinare la tabella per minimizzare la dimensioni tuple e dà 80.
CREATE TABLE test (
column_3 bigint
,column_4 bigint
,column_9 timestamp
,column_1 int
,column_2 int
,column_10 boolean
,column_11 boolean
,column_7 numeric(5,2)
,column_8 numeric(5,2)
,column_5 text
,column_6 text);
INSERT INTO test
VALUES(1,1,current_timestamp,1,1,true,false,12,12,'test','test_1');
SELECT pg_column_size(test) FROM test;
pg_column_size
----------------
80
c'è qualche suggerimento per ordine di colonne in PostgreSQL?
I tipi di dimensione fissa deve essere posto come 8-byte prima poi 4- byte quindi 2 byte e quindi 1 byte. Che dire di tipo di dimensione variabile come char (n), varchar (n), testo, numerico (p, s). Penso che sia numerico (p, s), char (n), varchar (n) e poi testo. La mia comprensione è corretta? – user3756488
@ user3756488: È possibile combinare tipi di dimensioni variabili che non devono essere allineati liberamente (scegliere un ordine significativo senza tenere conto della memorizzazione). Solo i tipi che devono essere allineati fanno la differenza in questo allineamento potrebbe richiedere il riempimento. Aiuta anche le prestazioni (non la memorizzazione) un pochino per avere colonne a lunghezza fissa, non null prima. –
Grazie Erwin Brandstetter. – user3756488