ã«ãã£ãŠæèµ·ããã倧èŠæš¡ãªããŒã¿ ã¹ããªãŒã ã®èšé²ã«é¢ãããããã¯ã®ç¶ç¶
ã«ã€ããŠè©±ããŸããã TOASTã®èšå®ãšããŒã¿ã®é 眮ã ãå¹³åããŠãããããã®æ¹æ³ã¯ããŸãå€ãã®ãªãœãŒã¹ãç¯çŽããŸããããã¢ããªã±ãŒã·ã§ã³ ã³ãŒãããŸã£ããå€æŽããå¿ èŠã¯ãããŸããã
ãã ããã»ãšãã©ãã¹ãŠã®ã¢ãã¿ãªã³ã°ã®ã¹ãã¬ãŒãžã¯ãã®æ§è³ªäžã ã»ãšãã©ã¯è¿œå ã®ã¿ èšé²ãããããŒã¿ã«é¢ããŠã¯ã代ããã«ãã£ã¹ã¯ã«æžã蟌ãããã«ããŒã¿ããŒã¹ã«ã©ã®ããã«æãããããçåã«æã£ãŠããå Žåã¯ã 200MB /ç§ ååã®é - ç«ã®äžã§ãé¡ãããŸãã
ããã°ããŒã¿ã®å°ããªç§å¯
è·åãããã£ãŒã«å¥
ãã以æ¥
ãçãããŒã¿ãæžã蟌ãããŒãã«ã® 1 ã€ã®æ§é ãèŠãŠã¿ãŸããããã€ãŸãããã° ãšã³ããªã®å ã®ããã¹ãã¯æ¬¡ã®ãšããã§ãã
CREATE TABLE rawdata_orig(
pack -- PK
uuid NOT NULL
, recno -- PK
smallint NOT NULL
, dt -- клÑÑ ÑекÑОО
date
, data -- ÑаЌПе главМПе
text
, PRIMARY KEY(pack, recno)
);
å žåçãªæšè (ãã¡ããããã§ã«ã»ã¯ã·ã§ã³åãããŠãããããããã¯ã»ã¯ã·ã§ã³ ãã³ãã¬ãŒãã§ã)ãæãéèŠãªã®ã¯ããã¹ãã§ããæã«ã¯ããªãããªã¥ãŒã ã®ãããã®ããããŸãã
PG å
ã® 1 ã€ã®ã¬ã³ãŒãã®ãç©çããµã€ãºãè€æ°ã®ããŒã¿ ããŒãžãå ããããšã¯ã§ããŸãããããè«çããµã€ãºã¯ãŸã£ããå¥ã®åé¡ã§ããããšã«æ³šæããŠãã ãããäœç©å€ (varchar/text/bytea) ããã£ãŒã«ãã«æžã蟌ãã«ã¯ã次ã䜿çšããŸãã
PostgreSQL ã¯åºå®ããŒãž ãµã€ãº (é垞㯠8 KB) ã䜿çšããã¿ãã«ãè€æ°ã®ããŒãžã«ãŸãããããšãèš±å¯ããŸããããããã£ãŠãéåžžã«å€§ããªãã£ãŒã«ãå€ãçŽæ¥æ ŒçŽããããšã¯ã§ããŸããããã®å¶éãå æããããã«ã倧ããªãã£ãŒã«ãå€ã¯å§çž®ãããããè€æ°ã®ç©çè¡ã«åå²ããããããŸããããã¯ãŠãŒã¶ãŒãæ°ä»ããªããã¡ã«çºçããã»ãšãã©ã®ãµãŒã㌠ã³ãŒãã«ã¯ã»ãšãã©åœ±é¿ãäžããŸããããã®æ¹æ³ã¯ 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ã«å ¥ããŠãã ãããããã¯ã1 ã€ã®ã³ãã³ãã§çŽæ¥å®è¡ã§ããŸãã
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 åæžããŸããããã£ã¹ã¯ã ãã§ãªã CPU ãã¢ã³ããŒããããŸãã
ãã£ã¹ã¯ã®ãæžã蟌ã¿ãã ãã§ãªããèªã¿åããã®åŠçãå°ãããªã£ãŠããããšã«æ³šæããŠãã ãããããŒãã«ã«ã¬ã³ãŒããæ¿å
¥ãããšãã«ãã€ã³ããã¯ã¹ã決å®ããããã«åã€ã³ããã¯ã¹ã®ããªãŒã®äžéšããèªã¿åããå¿
èŠãããããã§ãã圌ãã®äžã§ã®å°æ¥ã®ç«å Žã
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 ããŒã»ã³ããããžãŒãã§ãããããããããäœããã®åœ¢ã§ CPU ã«åœ±é¿ãäžããã®ã§ã¯ãªãã§ãããã?
å°ãªããšããã以äžæªåããããšã¯ãªãã£ãããã ãããã®ãããªããªã¥ãŒã ã§ãå¹³å CPU è² è·ãããã«é«ããããšãã§ããªããã©ãããå€æããã®ã¯å°é£ã§ãã 5%.
é ã®äœçœ®ãå€æŽãããšãåèšã... å€ãããŸãã
ãåç¥ã®ãšããã1 ãããŒã§ 1 ã«ãŒãã«ã®ç¯çŽã«ãªããŸããåœç€Ÿã®ä¿ç®¡éã䜿ãã°ãçŽ 1 ã«ãŒãã«ã®ç¯çŽã«ãªããŸãã 10TB/æ ããããªæé©åã§ã倧ããªå©çãåŸãããå¯èœæ§ããããŸãããããã£ãŠãç§ãã¡ã¯ããŒã¿ã®ç©çæ§é ã«æ³šæãæããŸããã ã¬ã³ãŒãå ã®ãç©ã¿éããããããã£ãŒã«ã ããããã®ããŒãã«ã
ã®ããã§
å€ãã®ã¢ãŒããã¯ãã£ã¯ããã·ã³ã¯ãŒãå¢çã§ã®ããŒã¿é 眮ãæäŸããŸããããšãã°ã32 ããã x86 ã·ã¹ãã ã§ã¯ãæŽæ° (æŽæ°åã4 ãã€ã) 㯠4 ãã€ãã®ã¯ãŒãå¢çã«é 眮ãããå粟床浮åå°æ°ç¹æ° (å粟床浮åå°æ°ç¹ã8 ãã€ã) ãåæ§ã§ãã 64 ããã ã·ã¹ãã ã§ã¯ãdouble å€ã¯ 8 ãã€ãã®ã¯ãŒãå¢çã«æããããŸãããããéäºææ§ã®çç±ã® XNUMX ã€ã§ãã
é 眮ã«ãããããŒãã«ã®è¡ã®ãµã€ãºã¯ãã£ãŒã«ãã®é åºã«ãã£ãŠç°ãªããŸããéåžžããã®åœ±é¿ã¯ããŸãé¡èã§ã¯ãããŸããããå Žåã«ãã£ãŠã¯ããµã€ãºã®å€§å¹ ãªå¢å ã«ã€ãªããå¯èœæ§ããããŸããããšãã°ã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 ãã€ãå¢çã«é 眮ããã 4 ãã€ãã® smallint 次ã®ãã£ãŒã«ãã®åãããã³æåŸã®ãã£ãŒã«ãã®å Žåã¯äœããªããæŽåããå¿ èŠã¯ãããŸããã
çè«äžã¯ãã¹ãŠåé¡ãªãããã£ãŒã«ããèªç±ã«äžŠã¹æ¿ããããšãã§ããŸããããŒãã«ã® 10 ã€ïŒæ¥æ¬¡ã»ã¯ã·ã§ã³ã 15 ïœ XNUMX GB ãå ããïŒã®äŸã䜿çšããŠãå®éã®ããŒã¿ã§ããã確èªããŠã¿ãŸãããã
åææ§é :
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%ç¯çŽã³ãŒãã 1 è¡ãå€æŽããããšãªããã¯ãã¯ãïŒ
ãã£ãŒã«ããé
眮ããããã®äžèšã®ãªãã·ã§ã³ãæé©ã§ãããšããäºå®ã§ã¯ãªãããšã«æ³šæããŠãã ãããçŸççç±ãããã£ãŒã«ãã®äžéšã®ãããã¯ããåãé¢ããããšã¯æãŸãªãããã§ããããšãã°ãããã€ãã®ãã£ãŒã«ã (pack, recno)
ãããã¯ãã®ããŒãã«ã® PK ã§ãã
äžè¬ã«ããã£ãŒã«ãã®ãæå°ãé
眮ã決å®ããããšã¯ãéåžžã«åçŽãªã匷åŒãªãã¿ã¹ã¯ã§ãããããã£ãŠãã客æ§ã®ããŒã¿ããã¯ãç§ãã¡ã®ããŒã¿ãããããã«åªããçµæãåŸãããšãã§ããŸããè©ŠããŠã¿ãŠãã ããã
åºæïŒ habr.com