ααΆααααααααααΆαααααααΆααααααααΆααααααΈααα·αααααααααααααΆαααΎαα‘αΎαααα
ααΎαααΉααα·ααΆαα’αααΈ ααΆαααααα TOAST αα·αααΆααααααΉααα·αααααα. "ααΆααααα" αα·ααΈααΆαααααααΆαααααααΉααα·ααααααΆαα»αααααΆαα αααΎαααααα ααα»ααααααααα·αααααααααΌααααααα·ααΈααΆαααααααα
αααααΆαααΆαααΆααααα αααα·αααααααααααΎαααΆααααααα
ααΆααΆαααα·αααΆαα
αααΎααααα»αααΏαααα α
αΆααααΆααααΈααΆααααα»αααααΆααααα½ααα·αα·αααααααΎαααααΆααα’αααααααααααΆαα·ααααααΆα ααΆαα
αααΎαααααααααααα»αααααα αα
αααα»ααααααααααααα·αααααααααααΆααααααααΆα α αΎαααααα·αααΎα’ααααααααααΈαααααααα’αααα’αΆα
ααααααααΌαααααΆααα·ααααααα±ααααααααα
ααΆααααα½ααα·αα 200MB / αα·ααΆααΈ ααΆαααααααΆαα
αααΎα - ααΌααα
αααααααααΆα
α’αΆααααααΆαααα·α αα½α αααα·αααααααα
ααΆαααααααααΆαααΆα
α αΎαα
αΆααααΆααααΈ
ααΌααααα‘ααααΎααα ααΆααααααααααααΆααΆααα½ααααα»αα ααααααΆααΆααααααΎαααααααα·αααααα "αα " - αααααΊααΆα’αααααααΎαααΈααΆαα»αααααα ααα»α
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/αα ααΌααααΈβααβααΆαβαααααΎαβααααα·αααααΆαβαα·α αα½α βα’αΆα βαααααβααααΆααβα ααααβααΆαβααα’α ααΌα ααααα αΎα ααΎαααΆαααα α·ααααα»αααΆααααΎαα ααΆααααααααααΌααααααααα·ααααααααααααΎα - αααααα·αααααΆαα ααΆα "ααα" αα ααΆααααα»ααααααααααΆ ααΆααΆαααΈαα½ααα
αααααΆααα
ααααΆααααααααααΆα αααΎααααααααΌαααΆααααααΉααα·αααααααα ααΎαααααααααΆααααααΆαααΈαα α§ααΆα ααα αα ααΎαααααααα 32 αααΈα x86 α ααα½αααα (ααααααα ααα½αααα 4 αα) ααΉαααααΌαααΆααααααΉααα ααΎαααααααααΆααα 4 αα ααΌα ααΉααααα ααα»α α’αααααααΉααααααΆαααΆαααΆααααΆαααααααα (α ααα»α α’αααααααΆαααΆααααΆααααΈααα 8 αα)α α αΎααα ααΎαααααααα 64 αααΈα αααααααααααααΉαααααΌαααΆααααααΉααα αααααααααΆααα 8 ααα αααααΆα ααα»αααα½ααααααααΆααα·ααααΈααααΆ
αααααΆαααΆααααααΉα ααα ααααα½αααΆααΆαα’αΆαααααααΎααααΆααααααΆαα ααΆααααααΆα₯αααα·ααααααα·ααα½αα’αααααααααΆααααααΆαααα ααα»αααααααα»αααααΈααααααΆα’αΆα ααΆαα’ααααΆαααΆαααΎαα‘αΎααααΆαααααΆααααααα αα α§ααΆα ααα ααααα·αααΎα’αααααΆα char(1) αα·α integer fields αααααΆααααααΆααΉαααΆα 3 bytes ααααααααΆααααΆααα½αααΆα
α αΌαα αΆααααααΎαααΆαα½αααΉαααααΌαααααα
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 ααααΆααααααΉαααΎααααααα 4 αα αα»ααααααΆααααααΆαα α αΎααα ααααααααΆααΆα α»αααααα ααααΆαα’αααΈ αα·ααα·αα αΆαααΆα ααααααΉαααα
ααΆαααααΉααααΈ α’αααΈααααααααΆαααΊααα’ α αΎαα’αααα’αΆα αααα αααΆαα‘αΎααα·αααΆααααα’αααα αΌαα α·αααα ααΌααα·αα·αααααΎαααΆαα ααΎαα·αααααααα·ααααααααΎα§ααΆα αααααααΆααΆααα½ααααα»αα ααααααΆααΆααααααΆααααααααα αΆααααααααααΆααααΆαα 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