ืืืฉื ืื ืืฉื ืฉื ืืงืืืช ืืจืื ื ืชืื ืื ืืืืืื ืฉืืืขืื ืขื ืืื
ื ืืืจ ืขื ืืืืจืืช TOAST ืืืืฉืืจ ื ืชืื ืื. "ืืืืืฆืข", โโืฉืืืืช ืืื ืื ืืืกืื ืืฉืืืื ืจืืื ืืื, ืื ืืืื ืืฉื ืืช ืืช ืงืื ืืืืฉืื ืืื.
ืขื ืืืช, ืื ืืกืืื ืฉืื ื ืืชืืจืจ ืืืื ืคืจืืืืงืืืื ืืืงืฉืจ ืื, ืฉืื ืืืืกืื ืฉื ืืืขื ืื ื ืืืืจ ืืืืขื ืืื ืืขืืงืจ ืืฆืจืฃ ืืืื ืืืืื ืช ื ืชืื ืื ืืืงืืืื. ืืื ืืชื ืชืืื ืืื ืืชื ืืืื ืืืื ืืช ืืกื ืื ืชืื ืื ืืืชืื ืืืืกืง ืืืงืื 200MB / s ืืฆื ืืืชืจ - ืืืงืฉื ืืชืืช ืืืชืื.
ืกืืืืช ืงืื ืื ืฉื ืืื ืืืื
ืืคื ืคืจืืคืื ืขืืืื
ืืืื
ืืื ื ืกืชืื ืขื ืืืื ื ืฉื ืืืช ืืืืืืืช ืฉืืชืืื ืื ื ืืืชืืื ื ืชืื ืื "ืืืืืืื" - ืืืืืจ, ืื ื ืืืงืกื ืืืงืืจื ืืชืื ืขืจื ืืืืื:
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) ืืฉืื, ืืฉืชืืฉ
PostgreSQL ืืฉืชืืฉ ืืืืื ืขืืื ืงืืืข (ืืืจื ืืื 8 KB), ืืืื ื ืืืคืฉืจ ื-tuples ืืืฉืชืจืข ืขื ืคื ื ืืกืคืจ ืขืืืืื. ืืื, ืื ืืคืฉืจ ืืืืกื ืืฉืืจืืช ืขืจืื ืฉืืืช ืืืืืื ืืืื. ืืื ืืืชืืืจ ืขื ืืืืื ืื, ืขืจืื ืฉืื ืืืืืื ื ืืืกืื ื/ืื ืืคืืฆืืื ืขื ืคื ื ืืกืคืจ ืงืืืื ืคืืืืื. ืื ืงืืจื ืืืื ืืฉืื ืื ืืืฉืชืืฉ ืืืฉ ืื ืืฉืคืขื ืืืขืื ืขื ืจืื ืงืื ืืฉืจืช. ืฉืืื ืื ืืืืขื ืืฉื TOAST...
ืืืขืฉื, ืขืืืจ ืื ืฉืืืื ืขื ืฉืืืช "ืคืืื ืฆืืืืืื ืืืืืื", ืืืืคื ืืืืืืื
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 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);
ืืืื ื ืจืื ืืืฆื ืืืืืจืืช ืืืืฉืืช ืืฉืคืืขื ืขื ืืขืื ืช ืืืืกืง ืืืืจ ืืืืจื ืืืืฉ:
ืื ืจืข! ืึฐืืึผืฆึธืข ืืชืืจ ืืืืกืง ืืจื ืืขืจื 1.5 ืคืขืืื, ืืืืืกืง "ืขืกืืง" ืืื 20 ืืืื! ืืื ืืืื ืื ืืฉืคืืข ืืืืฉืื ืขื ืืืขืื?
ืืคืืืช ืื ืื ื ืืื ืืืชืจ ืืจืืข. ืืืจืืช ืฉืงืฉื ืืฉืคืื ืื ืืคืืื ื ืคืืื ืืืื ืขืืืื ืื ืืืืืื ืืืขืืืช ืืช ืขืืืก ืืืขืื ืืืืืฆืข ืืืื ืืืชืจ 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
) ืืคื ืืกืคืจ ืืจืฉืืืืช ืฉืื - ืืืืืจ, ืื ืื ื ืืงืืืื ืืืื ืืืืฆืข ืฉื ืจืฉืืื ืืืืืกื ืช ืืคืืขื:
ืืื ืืก 6% ื ืคื, ืืืื!
ืืื ืืื, ืืืืื, ืื ืื ืื ืืจืื - ืืืจื ืืื, ืืืื ืืงืกืื ืืื ื ื ืืืืืื ืืฉื ืืช ืืช ืกืืจ ืืฉืืืช, ืืืื "ืืืืคื ืืืื" (pg_total_relation_size
) ...
...ืขืืืื ืื ืืื ืืกื 1.5%ืืืื ืืฉื ืืช ืฉืืจืช ืงืื ืืืช. ืื ืื!
ืื ื ืืฆืืื ืฉืืืคืฉืจืืช ืืขืื ืืกืืืืจ ืฉืืืช ืืื ื ืืขืืืื ืฉืืื ืืืืคืืืืืืช ืืืืชืจ. ืื ืืชื ืื ืจืืฆื "ืืงืจืืข" ืืื ืืืฉื ืฉืืืช ืืกืืืืช ืืกืชืืืืช - ืืืฉื, ืืื (pack, recno)
, ืฉืืื ื-PK ืขืืืจ ืืืื ืื.
ืืืืคื ืืืื, ืงืืืขืช ืืกืืจ ื"ืืื ืืืื" ืฉื ืฉืืืช ืืื ืืฉืืื ืคืฉืืื ืืืื ืฉื "ืืื ืืืืจื". ืืื, ืืชื ืืืื ืืงืื ืืื ืชืื ืื ืฉืื ืชืืฆืืืช ืืืืืช ืขืื ืืืชืจ ืืฉืื ื - ื ืกื ืืืช!
ืืงืืจ: www.habr.com