ื—ืกื•ืš ืื’ื•ืจื” ืขืœ ื ืคื—ื™ื ื’ื“ื•ืœื™ื ื‘-PostgreSQL

ื”ืžืฉืš ื”ื ื•ืฉื ืฉืœ ื”ืงืœื˜ืช ื–ืจืžื™ ื ืชื•ื ื™ื ื’ื“ื•ืœื™ื ืฉื”ื•ืขืœื• ืขืœ ื™ื“ื™ ืžืืžืจ ืงื•ื“ื ืขืœ ื—ืœื•ืงื” ืœืžื—ื™ืฆื•ืช, ื‘ื–ื” ื ื‘ื—ืŸ ืืช ื”ื“ืจื›ื™ื ืฉื‘ื”ืŸ ืืชื” ื™ื›ื•ืœ ืœื”ืคื—ื™ืช ืืช ื”ื’ื•ื“ืœ ื”"ืคื™ื–ื™" ืฉืœ ื”ืžืื•ื—ืกืŸ ื‘-PostgreSQL, ื•ื”ืฉืคืขืชื ืขืœ ื‘ื™ืฆื•ืขื™ ื”ืฉืจืช.

ื ื“ื‘ืจ ืขืœ ื”ื’ื“ืจื•ืช TOAST ื•ื™ื™ืฉื•ืจ ื ืชื•ื ื™ื. "ื‘ืžืžื•ืฆืข", โ€‹โ€‹ืฉื™ื˜ื•ืช ืืœื” ืœื ื™ื—ืกื›ื• ืžืฉืื‘ื™ื ืจื‘ื™ื ืžื“ื™, ืืš ืžื‘ืœื™ ืœืฉื ื•ืช ืืช ืงื•ื“ ื”ื™ื™ืฉื•ื ื›ืœืœ.

ื—ืกื•ืš ืื’ื•ืจื” ืขืœ ื ืคื—ื™ื ื’ื“ื•ืœื™ื ื‘-PostgreSQL
ืขื ื–ืืช, ื”ื ื™ืกื™ื•ืŸ ืฉืœื ื• ื”ืชื‘ืจืจ ืžืื•ื“ ืคืจื•ื“ื•ืงื˜ื™ื‘ื™ ื‘ื”ืงืฉืจ ื–ื”, ืฉื›ืŸ ื”ืื—ืกื•ืŸ ืฉืœ ื›ืžืขื˜ ื›ืœ ื ื™ื˜ื•ืจ ืžื˜ื‘ืขื• ื”ื•ื ื‘ืขื™ืงืจ ืœืฆืจืฃ ื‘ืœื‘ื“ ืžื‘ื—ื™ื ืช ื ืชื•ื ื™ื ืžื•ืงืœื˜ื™ื. ื•ืื ืืชื” ืชื•ื”ื” ืื™ืš ืืชื” ื™ื›ื•ืœ ืœืœืžื“ ืืช ืžืกื“ ื”ื ืชื•ื ื™ื ืœื›ืชื•ื‘ ืœื“ื™ืกืง ื‘ืžืงื•ื 200MB / s ื—ืฆื™ ื™ื•ืชืจ - ื‘ื‘ืงืฉื” ืžืชื—ืช ืœื—ืชื•ืœ.

ืกื•ื“ื•ืช ืงื˜ื ื™ื ืฉืœ ื‘ื™ื’ ื“ืื˜ื”

ืœืคื™ ืคืจื•ืคื™ืœ ืขื‘ื•ื“ื” ื”ืฉื™ืจื•ืช ืฉืœื ื•, ื”ื ื˜ืกื™ื ืืœื™ื• ื‘ืงื‘ื™ืขื•ืช ืžื”ืžืื•ืจื•ืช ื—ื‘ื™ืœื•ืช ื˜ืงืกื˜.

ื•ืžืื– ืžืชื—ื VLSIืฉื‘ืกื™ืก ื”ื ืชื•ื ื™ื ืฉืœื• ืื ื—ื ื• ืžื ื˜ืจื™ื ื”ื•ื ืžื•ืฆืจ ืžืจื•ื‘ื” ืจื›ื™ื‘ื™ื ืขื ืžื‘ื ื™ ื ืชื•ื ื™ื ืžื•ืจื›ื‘ื™ื, ื•ืื– ืฉืื™ืœืชื•ืช ืœื‘ื™ืฆื•ืขื™ื ืžืงืกื™ืžืœื™ื™ื ืœื”ืชื‘ืจืจ ื“ื™ ื›ื›ื” "ืจื‘ ื ืคื—ื™ื" ืขื ืœื•ื’ื™ืงื” ืืœื’ื•ืจื™ืชืžื™ืช ืžื•ืจื›ื‘ืช. ื›ืš ืฉื”ื ืคื— ืฉืœ ื›ืœ ืžื•ืคืข ื‘ื•ื“ื“ ืฉืœ ื‘ืงืฉื” ืื• ืชื•ื›ื ื™ืช ื”ื‘ื™ืฆื•ืข ืฉื ื•ืฆืจืช ื‘ื™ื•ืžืŸ ืฉืžื’ื™ืข ืืœื™ื ื• ืžืชื‘ืจืจ ื›"ื‘ืžืžื•ืฆืข" ื“ื™ ื’ื“ื•ืœ.

ื”ื‘ื” ื ืกืชื›ืœ ืขืœ ื”ืžื‘ื ื” ืฉืœ ืื—ืช ื”ื˜ื‘ืœืื•ืช ืฉืœืชื•ื›ื” ืื ื• ื›ื•ืชื‘ื™ื ื ืชื•ื ื™ื "ื’ื•ืœืžื™ื™ื" - ื›ืœื•ืžืจ, ื”ื ื” ื”ื˜ืงืกื˜ ื”ืžืงื•ืจื™ ืžืชื•ืš ืขืจืš ื”ื™ื•ืžืŸ:

CREATE TABLE rawdata_orig(
  pack -- PK
    uuid NOT NULL
, recno -- PK
    smallint NOT NULL
, dt -- ะบะปัŽั‡ ัะตะบั†ะธะธ
    date
, data -- ัะฐะผะพะต ะณะปะฐะฒะฝะพะต
    text
, PRIMARY KEY(pack, recno)
);

ืฉืœื˜ ื˜ื™ืคื•ืกื™ (ื›ื‘ืจ ื—ืชื•ืš, ื›ืžื•ื‘ืŸ, ืื– ื–ื• ืชื‘ื ื™ืช ืžื“ื•ืจ), ืฉื‘ื• ื”ื“ื‘ืจ ื”ื—ืฉื•ื‘ ื‘ื™ื•ืชืจ ื”ื•ื ื”ื˜ืงืกื˜. ืœืคืขืžื™ื ื“ื™ ื ืคื—.

ื ื–ื›ื™ืจ ืฉื”ื’ื•ื“ืœ ื”"ืคื™ื–ื™" ืฉืœ ืจืฉื•ืžื” ืื—ืช ื‘-PG ืœื ื™ื›ื•ืœ ืœืชืคื•ืก ื™ื•ืชืจ ืžืขืžื•ื“ ืื—ื“ ืฉืœ ื ืชื•ื ื™ื, ืื‘ืœ ื”ื’ื•ื“ืœ ื”"ื”ื’ื™ื•ื ื™" ื”ื•ื ืขื ื™ื™ืŸ ืื—ืจ ืœื’ืžืจื™. ื›ื“ื™ ืœื›ืชื•ื‘ ืขืจืš ื ืคื—ื™ (varchar/text/bytea) ืœืฉื“ื”, ื”ืฉืชืžืฉ ื˜ื›ื ื•ืœื•ื’ื™ื™ืช TOAST:

PostgreSQL ืžืฉืชืžืฉ ื‘ื’ื•ื“ืœ ืขืžื•ื“ ืงื‘ื•ืข (ื‘ื“ืจืš ื›ืœืœ 8 KB), ื•ืื™ื ื• ืžืืคืฉืจ ืœ-tuples ืœื”ืฉืชืจืข ืขืœ ืคื ื™ ืžืกืคืจ ืขืžื•ื“ื™ื. ืœื›ืŸ, ืื™ ืืคืฉืจ ืœืื—ืกืŸ ื™ืฉื™ืจื•ืช ืขืจื›ื™ ืฉื“ื•ืช ื’ื“ื•ืœื™ื ืžืื•ื“. ื›ื“ื™ ืœื”ืชื’ื‘ืจ ืขืœ ืžื’ื‘ืœื” ื–ื•, ืขืจื›ื™ ืฉื“ื” ื’ื“ื•ืœื™ื ื ื“ื—ืกื™ื ื•/ืื• ืžืคื•ืฆืœื™ื ืขืœ ืคื ื™ ืžืกืคืจ ืงื•ื•ื™ื ืคื™ื–ื™ื™ื. ื–ื” ืงื•ืจื” ืžื‘ืœื™ ืœืฉื™ื ืœื‘ ืœืžืฉืชืžืฉ ื•ื™ืฉ ืœื• ื”ืฉืคืขื” ืžื•ืขื˜ื” ืขืœ ืจื•ื‘ ืงื•ื“ ื”ืฉืจืช. ืฉื™ื˜ื” ื–ื• ื™ื“ื•ืขื” ื‘ืฉื TOAST...

ืœืžืขืฉื”, ืขื‘ื•ืจ ื›ืœ ืฉื•ืœื—ืŸ ืขื ืฉื“ื•ืช "ืคื•ื˜ื ืฆื™ืืœื™ื™ื ื’ื“ื•ืœื™ื", ื‘ืื•ืคืŸ ืื•ื˜ื•ืžื˜ื™ ื ื•ืฆืจืช ื˜ื‘ืœื” ืžื–ื•ื•ื’ืช ืขื "ื—ื™ืชื•ืš". ื›ืœ ืจืฉื•ืžื” "ื’ื“ื•ืœื”" ื‘ืžืงื˜ืขื™ื ืฉืœ 2KB:

TOAST(
  chunk_id
    integer
, chunk_seq
    integer
, chunk_data
    bytea
, PRIMARY KEY(chunk_id, chunk_seq)
);

ื›ืœื•ืžืจ, ืื ืขืœื™ื ื• ืœื›ืชื•ื‘ ืžื—ืจื•ื–ืช ืขื ืขืจืš "ื’ื“ื•ืœ". data, ืื– ื”ื”ืงืœื˜ื” ื”ืืžื™ืชื™ืช ืชืชืจื—ืฉ ืœื ืจืง ืœืฉื•ืœื—ืŸ ื”ืจืืฉื™ ื•ืœ-PK ืฉืœื•, ืืœื ื’ื ืœ-TOAST ื•ืœ-PK ืฉืœื•.

ื”ืคื—ืชืช ื”ืฉืคืขืช TOAST

ืื‘ืœ ืจื•ื‘ ื”ืฉื™ืื™ื ืฉืœื ื• ืขื“ื™ื™ืŸ ืœื ื›ืœ ื›ืš ื’ื“ื•ืœื™ื, ืฆืจื™ืš ืœื”ืชืื™ื ืœ-8KB - ืื™ืš ืื ื™ ื™ื›ื•ืœ ืœื—ืกื•ืš ื›ืกืฃ ืขืœ ื–ื”?..

ื›ืืŸ ื‘ืื” ื”ืชื›ื•ื ื” ืœืขื–ืจืชื ื• STORAGE ื‘ืขืžื•ื“ืช ื”ื˜ื‘ืœื”:

  • ืžื•ืจื—ื‘ื™ื ืžืืคืฉืจ ื’ื ื“ื—ื™ืกื” ื•ื’ื ืื—ืกื•ืŸ ื ืคืจื“. ื–ึถื” ืืคืฉืจื•ืช ืกื˜ื ื“ืจื˜ื™ืช ืขื‘ื•ืจ ืจื•ื‘ ืกื•ื’ื™ ื”ื ืชื•ื ื™ื ื”ืชื•ืืžื™ื ืœ-TOAST. ืชื—ื™ืœื” ื”ื•ื ืžื ืกื” ืœื‘ืฆืข ื“ื—ื™ืกื”, ื•ืื– ืžืื—ืกืŸ ืื•ืชื• ืžื—ื•ืฅ ืœื˜ื‘ืœื” ืื ื”ืฉื•ืจื” ืขื“ื™ื™ืŸ ื’ื“ื•ืœื” ืžื“ื™.
  • ืจึธืืฉืึดื™ ืžืืคืฉืจ ื“ื—ื™ืกื” ืืš ืœื ืื—ืกื•ืŸ ื ืคืจื“. (ืœืžืขืฉื”, ืื—ืกื•ืŸ ื ืคืจื“ ืขื“ื™ื™ืŸ ื™ืชื‘ืฆืข ืขื‘ื•ืจ ืขืžื•ื“ื•ืช ื›ืืœื”, ืื‘ืœ ืจืง ื›ืžื•ืฆื ืื—ืจื•ืŸ, ื›ืืฉืจ ืื™ืŸ ื“ืจืš ืื—ืจืช ืœื›ื•ื•ืฅ ืืช ื”ืžื—ืจื•ื–ืช ื›ืš ืฉืชืชืื™ื ืœื“ืฃ.)

ืœืžืขืฉื”, ื–ื” ื‘ื“ื™ื•ืง ืžื” ืฉืื ื—ื ื• ืฆืจื™ื›ื™ื ืขื‘ื•ืจ ื”ื˜ืงืกื˜ - ื“ื—ืกื• ืื•ืชื• ื›ืžื” ืฉื™ื•ืชืจ, ื•ืื ื”ื•ื ืœื ืžืชืื™ื ื‘ื›ืœืœ, ืฉื™ืžื• ืื•ืชื• ื‘-TOAST. ื ื™ืชืŸ ืœืขืฉื•ืช ื–ืืช ื™ืฉื™ืจื•ืช ืชื•ืš ื›ื“ื™ ืชื ื•ืขื”, ื‘ืคืงื•ื“ื” ืื—ืช:

ALTER TABLE rawdata_orig ALTER COLUMN data SET STORAGE MAIN;

ื›ื™ืฆื“ ืœื”ืขืจื™ืš ืืช ื”ื”ืฉืคืขื”

ืžื›ื™ื•ื•ืŸ ืฉื–ืจื™ืžืช ื”ื ืชื•ื ื™ื ืžืฉืชื ื” ืžื“ื™ ื™ื•ื, ืื™ื ื ื• ื™ื›ื•ืœื™ื ืœื”ืฉื•ื•ืช ืžืกืคืจื™ื ืžื•ื—ืœื˜ื™ื, ืืœื ื‘ืžื•ื ื—ื™ื ื™ื—ืกื™ื™ื ื ืชื— ืงื˜ืŸ ื™ื•ืชืจ ืจืฉืžื ื• ืืช ื–ื” ื‘-TOAST - ื”ืจื‘ื” ื™ื•ืชืจ ื˜ื•ื‘. ืื‘ืœ ื™ืฉ ื›ืืŸ ืกื›ื ื” - ื›ื›ืœ ืฉื”ื ืคื— ื”"ืคื™ื–ื™" ื’ื“ื•ืœ ื™ื•ืชืจ ืฉืœ ื›ืœ ืจืฉื•ืžื” ื‘ื•ื“ื“ืช, ื”ืื™ื ื“ืงืก ื”ื•ืคืš "ืจื—ื‘ ื™ื•ืชืจ", ื›ื™ ืขืœื™ื ื• ืœื›ืกื•ืช ื™ื•ืชืจ ื“ืคื™ ื ืชื•ื ื™ื.

ืžื“ื•ืจ ืœืคื ื™ ืฉื™ื ื•ื™ื™ื:

heap  = 37GB (39%)
TOAST = 54GB (57%)
PK    =  4GB ( 4%)

ืžื“ื•ืจ ืœืื—ืจ ืฉื™ื ื•ื™ื™ื:

heap  = 37GB (67%)
TOAST = 16GB (29%)
PK    =  2GB ( 4%)

ืœืžืขืฉื”, ืื ื—ื ื• ื”ืชื—ื™ืœ ืœื›ืชื•ื‘ ืœ-TOAST ืคื™ 2 ืคื—ื•ืช, ืืฉืจ ืคืจืง ืœื ืจืง ืืช ื”ื“ื™ืกืง, ืืœื ื’ื ืืช ื”ืžืขื‘ื“:

ื—ืกื•ืš ืื’ื•ืจื” ืขืœ ื ืคื—ื™ื ื’ื“ื•ืœื™ื ื‘-PostgreSQL
ื—ืกื•ืš ืื’ื•ืจื” ืขืœ ื ืคื—ื™ื ื’ื“ื•ืœื™ื ื‘-PostgreSQL
ืืฆื™ื™ืŸ ื›ื™ ื”ืคื›ื ื• ืœืงื˜ื ื™ื ื’ื ื‘"ืงืจื™ืืช" ื”ื“ื™ืกืง, ืœื ืจืง ื‘"ื›ืชื™ื‘ื”" - ืฉื›ืŸ ื‘ืขืช โ€‹โ€‹ื”ื›ื ืกืช ืจืฉื•ืžื” ืœื˜ื‘ืœื”, ืขืœื™ื ื• "ืœืงืจื•ื" ื’ื ื—ืœืง ืžื”ืขืฅ ืฉืœ ื›ืœ ืื™ื ื“ืงืก ื›ื“ื™ ืœืงื‘ื•ืข ืืช ืชืคืงื™ื“ ืขืชื™ื“ื™ ื‘ื”ื.

ืžื™ ื™ื›ื•ืœ ืœื—ื™ื•ืช ื˜ื•ื‘ ืขืœ PostgreSQL 11

ืœืื—ืจ ืขื“ื›ื•ืŸ ืœ-PG11, ื”ื—ืœื˜ื ื• ืœื”ืžืฉื™ืš "ืœื›ื•ื•ืŸ" TOAST ื•ืฉืžื ื• ืœื‘ ืฉื”ื—ืœ ืžื’ืจืกื” ื–ื• ื”ืคืจืžื˜ืจ ื”ืคืš ื–ืžื™ืŸ ืœื›ื•ื•ื ื•ืŸ toast_tuple_target:

ืงื•ื“ ื”ืขื™ื‘ื•ื“ ืฉืœ TOAST ืžื•ืคืขืœ ืจืง ื›ืืฉืจ ืขืจืš ื”ืฉื•ืจื” ืฉื™ืฉ ืœืื—ืกืŸ ื‘ื˜ื‘ืœื” ื’ื“ื•ืœ ืž-TOAST_TUPLE_THRESHOLD ื‘ืชื™ื (ื‘ื“ืจืš ื›ืœืœ 2 KB). ืงื•ื“ ื”-TOAST ื™ื“ื—ื•ืก ื•/ืื• ื™ืขื‘ื™ืจ ืขืจื›ื™ ืฉื“ื•ืช ืžื”ื˜ื‘ืœื” ืขื“ ืฉืขืจืš ื”ืฉื•ืจื” ื™ืคื—ืช ืž-TOAST_TUPLE_TARGET ื‘ืชื™ื (ืขืจืš ืžืฉืชื ื”, ื’ื ื‘ื“ืจืš ื›ืœืœ 2 KB) ืื• ืฉืœื ื ื™ืชืŸ ืœื”ืงื˜ื™ืŸ ืืช ื”ื’ื•ื“ืœ.

ื”ื—ืœื˜ื ื• ืฉื”ื ืชื•ื ื™ื ืฉื™ืฉ ืœื ื• ื‘ื“ืจืš ื›ืœืœ ื”ื "ืงืฆืจื™ื ืžืื•ื“" ืื• "ืืจื•ื›ื™ื ืžืื•ื“", ืื– ื”ื—ืœื˜ื ื• ืœื”ื’ื‘ื™ืœ ืืช ืขืฆืžื ื• ืœืขืจืš ื”ืžื™ื ื™ืžืœื™ ื”ืืคืฉืจื™:

ALTER TABLE rawplan_orig SET (toast_tuple_target = 128);

ื‘ื•ืื• ื ืจืื” ื›ื™ืฆื“ ื”ื”ื’ื“ืจื•ืช ื”ื—ื“ืฉื•ืช ื”ืฉืคื™ืขื• ืขืœ ื˜ืขื™ื ืช ื”ื“ื™ืกืง ืœืื—ืจ ื”ื’ื“ืจื” ืžื—ื“ืฉ:

ื—ืกื•ืš ืื’ื•ืจื” ืขืœ ื ืคื—ื™ื ื’ื“ื•ืœื™ื ื‘-PostgreSQL
ืœื ืจืข! ืžึฐืžื•ึผืฆึธืข ื”ืชื•ืจ ืœื“ื™ืกืง ื™ืจื“ ื‘ืขืจืš 1.5 ืคืขืžื™ื, ื•ื”ื“ื™ืกืง "ืขืกื•ืง" ื”ื•ื 20 ืื—ื•ื–! ืื‘ืœ ืื•ืœื™ ื–ื” ื”ืฉืคื™ืข ืื™ื›ืฉื”ื• ืขืœ ื”ืžืขื‘ื“?

ื—ืกื•ืš ืื’ื•ืจื” ืขืœ ื ืคื—ื™ื ื’ื“ื•ืœื™ื ื‘-PostgreSQL
ืœืคื—ื•ืช ื–ื” ืœื ื ื”ื™ื” ื™ื•ืชืจ ื’ืจื•ืข. ืœืžืจื•ืช ืฉืงืฉื” ืœืฉืคื•ื˜ ืื ืืคื™ืœื• ื ืคื—ื™ื ื›ืืœื” ืขื“ื™ื™ืŸ ืœื ื™ื›ื•ืœื™ื ืœื”ืขืœื•ืช ืืช ืขื•ืžืก ื”ืžืขื‘ื“ ื”ืžืžื•ืฆืข ื’ื‘ื•ื” ื™ื•ืชืจ 5%.

ืขืœ ื™ื“ื™ ืฉื™ื ื•ื™ ืžืงื•ืžื•ืช ื”ืžื•ื ื—ื™ื, ื”ืกื›ื•ื... ืžืฉืชื ื”!

ื›ืคื™ ืฉืืชื” ื™ื•ื“ืข, ืื’ื•ืจื” ื—ื•ืกื›ืช ืจื•ื‘ืœ, ื•ืขื ื ืคื—ื™ ื”ืื—ืกื•ืŸ ืฉืœื ื• ื–ื” ื‘ืขืจืš 10TB/ื—ื•ื“ืฉ ืืคื™ืœื• ืื•ืคื˜ื™ืžื™ื–ืฆื™ื” ืงื˜ื ื” ื™ื›ื•ืœื” ืœืชืช ืจื•ื•ื— ื˜ื•ื‘. ืœื›ืŸ, ืฉืžื ื• ืœื‘ ืœืžื‘ื ื” ื”ืคื™ื–ื™ ืฉืœ ื”ื ืชื•ื ื™ื ืฉืœื ื• โ€“ ืื™ืš ื‘ื“ื™ื•ืง ืฉื“ื•ืช "ืžื•ืขืจืžื™ื" ื‘ืชื•ืš ื”ืจืฉื•ืžื” ื›ืœ ืื—ื“ ืžื”ืฉื•ืœื—ื ื•ืช.

ื›ื™ ื‘ื’ืœืœ ื™ื™ืฉื•ืจ ื ืชื•ื ื™ื ื–ื” ื™ืฉืจ ืงื“ื™ืžื” ืžืฉืคื™ืข ืขืœ ื”ื ืคื— ื”ืžืชืงื‘ืœ:

ืืจื›ื™ื˜ืงื˜ื•ืจื•ืช ืจื‘ื•ืช ืžืกืคืงื•ืช ื™ื™ืฉื•ืจ ื ืชื•ื ื™ื ืขืœ ื’ื‘ื•ืœื•ืช ืžื™ืœื•ืช ืžื›ื•ื ื”. ืœื“ื•ื’ืžื”, ื‘ืžืขืจื›ืช x32 ืฉืœ 86 ืกื™ื‘ื™ื•ืช, ืžืกืคืจื™ื ืฉืœืžื™ื (ืกื•ื’ ืžืกืคืจ ืฉืœื, 4 ื‘ืชื™ื) ื™ื”ื™ื• ืžื™ื•ืฉืจื™ื ืขืœ ื’ื‘ื•ืœ ืžื™ืœื™ื ืฉืœ 4 ื‘ืชื™ื, ื•ื›ืš ื’ื ืžืกืคืจื™ ื ืงื•ื“ื” ืฆืคื” ื“ื™ื•ืง ื›ืคื•ืœื” (ื ืงื•ื“ื” ืฆืคื” ื›ืคื•ืœื”, 8 ื‘ืชื™ื). ื•ื‘ืžืขืจื›ืช ืฉืœ 64 ืกื™ื‘ื™ื•ืช, ืขืจื›ื™ื ื›ืคื•ืœื™ื ื™ื”ื™ื• ืžื™ื•ืฉืจื™ื ืœื’ื‘ื•ืœื•ืช ืžื™ืœื™ื ืฉืœ 8 ื‘ืชื™ื. ื–ื•ื”ื™ ืกื™ื‘ื” ื ื•ืกืคืช ืœื—ื•ืกืจ ื”ืชืืžื”.

ืขืงื‘ ื™ื™ืฉื•ืจ, ื’ื•ื“ืœ ืฉื•ืจืช ื˜ื‘ืœื” ืชืœื•ื™ ื‘ืกื“ืจ ื”ืฉื“ื•ืช. ื‘ื“ืจืš ื›ืœืœ ื”ืฉืคืขื” ื–ื• ืื™ื ื” ื‘ื•ืœื˜ืช ื‘ืžื™ื•ื—ื“, ืืš ื‘ืžืงืจื™ื ืžืกื•ื™ืžื™ื ื”ื™ื ืขืœื•ืœื” ืœื”ื•ื‘ื™ืœ ืœื’ื™ื“ื•ืœ ืžืฉืžืขื•ืชื™ ื‘ื’ื•ื“ืœ. ืœื“ื•ื’ืžื”, ืื ืืชื” ืžืขืจื‘ื‘ ืฉื“ื•ืช char(1) ื•ืฉื“ื•ืช ืฉืœืžื™ื, ื‘ื“ืจืš ื›ืœืœ ื™ืชื‘ื–ื‘ื–ื• ื‘ื™ื ื™ื”ื 3 ื‘ืชื™ื.

ื ืชื—ื™ืœ ืขื ื“ื’ืžื™ื ืกื™ื ืชื˜ื™ื™ื:

SELECT pg_column_size(ROW(
  '0000-0000-0000-0000-0000-0000-0000-0000'::uuid
, 0::smallint
, '2019-01-01'::date
));
-- 48 ะฑะฐะนั‚

SELECT pg_column_size(ROW(
  '2019-01-01'::date
, '0000-0000-0000-0000-0000-0000-0000-0000'::uuid
, 0::smallint
));
-- 46 ะฑะฐะนั‚

ืžืื™ืคื” ื”ื’ื™ืขื• ื›ืžื” ื‘ืชื™ื ื ื•ืกืคื™ื ื‘ืžืงืจื” ื”ืจืืฉื•ืŸ? ื–ื” ืคืฉื•ื˜ - 2-byte smallint ืžื™ื•ืฉืจ ืขืœ ื’ื‘ื•ืœ 4-byte ืœืคื ื™ ื”ืฉื“ื” ื”ื‘ื, ื•ื›ืืฉืจ ื”ื•ื ื”ืื—ืจื•ืŸ, ืื™ืŸ ืฉื•ื ื“ื‘ืจ ื•ืื™ืŸ ืฆื•ืจืš ืœื™ื™ืฉืจ.

ื‘ืชื™ืื•ืจื™ื”, ื”ื›ืœ ื‘ืกื“ืจ ื•ืืชื” ื™ื›ื•ืœ ืœืกื“ืจ ืžื—ื“ืฉ ืืช ื”ืฉื“ื•ืช ื›ืจืฆื•ื ืš. ื‘ื•ืื• ื ื‘ื“ื•ืง ืืช ื–ื” ืขืœ ื ืชื•ื ื™ื ืืžื™ืชื™ื™ื ื‘ืืžืฆืขื•ืช ื”ื“ื•ื’ืžื” ืฉืœ ืื—ืช ื”ื˜ื‘ืœืื•ืช, ืฉื”ื—ืœืง ื”ื™ื•ืžื™ ืฉืœื” ืชื•ืคืก 10-15GB.

ืžื‘ื ื” ืจืืฉื•ื ื™:

CREATE TABLE public.plan_20190220
(
-- ะฃะฝะฐัะปะตะดะพะฒะฐะฝะฐ from table plan:  pack uuid NOT NULL,
-- ะฃะฝะฐัะปะตะดะพะฒะฐะฝะฐ from table plan:  recno smallint NOT NULL,
-- ะฃะฝะฐัะปะตะดะพะฒะฐะฝะฐ from table plan:  host uuid,
-- ะฃะฝะฐัะปะตะดะพะฒะฐะฝะฐ from table plan:  ts timestamp with time zone,
-- ะฃะฝะฐัะปะตะดะพะฒะฐะฝะฐ from table plan:  exectime numeric(32,3),
-- ะฃะฝะฐัะปะตะดะพะฒะฐะฝะฐ from table plan:  duration numeric(32,3),
-- ะฃะฝะฐัะปะตะดะพะฒะฐะฝะฐ from table plan:  bufint bigint,
-- ะฃะฝะฐัะปะตะดะพะฒะฐะฝะฐ from table plan:  bufmem bigint,
-- ะฃะฝะฐัะปะตะดะพะฒะฐะฝะฐ from table plan:  bufdsk bigint,
-- ะฃะฝะฐัะปะตะดะพะฒะฐะฝะฐ from table plan:  apn uuid,
-- ะฃะฝะฐัะปะตะดะพะฒะฐะฝะฐ from table plan:  ptr uuid,
-- ะฃะฝะฐัะปะตะดะพะฒะฐะฝะฐ from table plan:  dt date,
  CONSTRAINT plan_20190220_pkey PRIMARY KEY (pack, recno),
  CONSTRAINT chck_ptr CHECK (ptr IS NOT NULL),
  CONSTRAINT plan_20190220_dt_check CHECK (dt = '2019-02-20'::date)
)
INHERITS (public.plan)

ืงื˜ืข ืœืื—ืจ ืฉื™ื ื•ื™ ืกื“ืจ ื”ืขืžื•ื“ื•ืช - ื‘ื“ื™ื•ืง ืื•ืชื ืฉื“ื•ืช, ืจืง ืกื“ืจ ืฉื•ื ื”:

CREATE TABLE public.plan_20190221
(
-- ะฃะฝะฐัะปะตะดะพะฒะฐะฝะฐ from table plan:  dt date NOT NULL,
-- ะฃะฝะฐัะปะตะดะพะฒะฐะฝะฐ from table plan:  ts timestamp with time zone,
-- ะฃะฝะฐัะปะตะดะพะฒะฐะฝะฐ from table plan:  pack uuid NOT NULL,
-- ะฃะฝะฐัะปะตะดะพะฒะฐะฝะฐ from table plan:  recno smallint NOT NULL,
-- ะฃะฝะฐัะปะตะดะพะฒะฐะฝะฐ from table plan:  host uuid,
-- ะฃะฝะฐัะปะตะดะพะฒะฐะฝะฐ from table plan:  apn uuid,
-- ะฃะฝะฐัะปะตะดะพะฒะฐะฝะฐ from table plan:  ptr uuid,
-- ะฃะฝะฐัะปะตะดะพะฒะฐะฝะฐ from table plan:  bufint bigint,
-- ะฃะฝะฐัะปะตะดะพะฒะฐะฝะฐ from table plan:  bufmem bigint,
-- ะฃะฝะฐัะปะตะดะพะฒะฐะฝะฐ from table plan:  bufdsk bigint,
-- ะฃะฝะฐัะปะตะดะพะฒะฐะฝะฐ from table plan:  exectime numeric(32,3),
-- ะฃะฝะฐัะปะตะดะพะฒะฐะฝะฐ from table plan:  duration numeric(32,3),
  CONSTRAINT plan_20190221_pkey PRIMARY KEY (pack, recno),
  CONSTRAINT chck_ptr CHECK (ptr IS NOT NULL),
  CONSTRAINT plan_20190221_dt_check CHECK (dt = '2019-02-21'::date)
)
INHERITS (public.plan)

ื”ื ืคื— ื”ื›ื•ืœืœ ืฉืœ ื”ืงื˜ืข ื ืงื‘ืข ืœืคื™ ืžืกืคืจ ื”"ืขื•ื‘ื“ื•ืช" ื•ืชืœื•ื™ ืจืง ื‘ืชื”ืœื™ื›ื™ื ื—ื™ืฆื•ื ื™ื™ื, ืื– ื‘ื•ืื• ื ื—ืœืง ืืช ื’ื•ื“ืœ ื”ืขืจื™ืžื” (pg_relation_size) ืœืคื™ ืžืกืคืจ ื”ืจืฉื•ืžื•ืช ืฉื‘ื• - ื›ืœื•ืžืจ, ืื ื—ื ื• ืžืงื‘ืœื™ื ื’ื•ื“ืœ ืžืžื•ืฆืข ืฉืœ ืจืฉื•ืžื” ืžืื•ื—ืกื ืช ื‘ืคื•ืขืœ:

ื—ืกื•ืš ืื’ื•ืจื” ืขืœ ื ืคื—ื™ื ื’ื“ื•ืœื™ื ื‘-PostgreSQL
ืžื™ื ื•ืก 6% ื ืคื—, ื’ื“ื•ืœ!

ืื‘ืœ ื”ื›ืœ, ื›ืžื•ื‘ืŸ, ืœื ื›ืœ ื›ืš ื•ืจื•ื“ - ืื—ืจื™ ื”ื›ืœ, ื‘ืื™ื ื“ืงืกื™ื ืื™ื ื ื• ื™ื›ื•ืœื™ื ืœืฉื ื•ืช ืืช ืกื“ืจ ื”ืฉื“ื•ืช, ื•ืœื›ืŸ "ื‘ืื•ืคืŸ ื›ืœืœื™" (pg_total_relation_size) ...

ื—ืกื•ืš ืื’ื•ืจื” ืขืœ ื ืคื—ื™ื ื’ื“ื•ืœื™ื ื‘-PostgreSQL
...ืขื“ื™ื™ืŸ ื’ื ื›ืืŸ ื—ืกืš 1.5%ืžื‘ืœื™ ืœืฉื ื•ืช ืฉื•ืจืช ืงื•ื“ ืื—ืช. ื›ืŸ ื›ืŸ!

ื—ืกื•ืš ืื’ื•ืจื” ืขืœ ื ืคื—ื™ื ื’ื“ื•ืœื™ื ื‘-PostgreSQL

ืื ื™ ืžืฆื™ื™ืŸ ืฉื”ืืคืฉืจื•ืช ืœืขื™ืœ ืœืกื™ื“ื•ืจ ืฉื“ื•ืช ืื™ื ื” ื”ืขื•ื‘ื“ื” ืฉื”ื™ื ื”ืื•ืคื˜ื™ืžืœื™ืช ื‘ื™ื•ืชืจ. ื›ื™ ืืชื” ืœื ืจื•ืฆื” "ืœืงืจื•ืข" ื›ืžื” ื’ื•ืฉื™ ืฉื“ื•ืช ืžืกื™ื‘ื•ืช ืืกืชื˜ื™ื•ืช - ืœืžืฉืœ, ื–ื•ื’ (pack, recno), ืฉื”ื•ื ื”-PK ืขื‘ื•ืจ ื˜ื‘ืœื” ื–ื•.

ื‘ืื•ืคืŸ ื›ืœืœื™, ืงื‘ื™ืขืช ื”ืกื“ืจ ื”"ืžื™ื ื™ืžืœื™" ืฉืœ ืฉื“ื•ืช ื”ื™ื ืžืฉื™ืžื” ืคืฉื•ื˜ื” ืœืžื“ื™ ืฉืœ "ื›ื•ื— ืื›ื–ืจื™". ืœื›ืŸ, ืืชื” ื™ื›ื•ืœ ืœืงื‘ืœ ืžื”ื ืชื•ื ื™ื ืฉืœืš ืชื•ืฆืื•ืช ื˜ื•ื‘ื•ืช ืขื•ื“ ื™ื•ืชืจ ืžืฉืœื ื• - ื ืกื” ื–ืืช!

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”