Chekwaa penny na nnukwu mpịakọta na PostgreSQL

Na-aga n'ihu na isiokwu nke ịdekọ nnukwu iyi data welitere edemede gara aga gbasara nkewa, na nke a anyị ga-eleba anya n'ụzọ ị nwere ike belata nha "anụ ahụ" nke echekwara na PostgreSQL, yana mmetụta ha na arụmọrụ nkesa.

Anyị ga-ekwu maka ya Ntọala TOAST na nhazi data. "Na nkezi," ụzọ ndị a agaghị echekwa ọtụtụ ihe onwunwe, mana na-enweghị ịgbanwe koodu ngwa ma ọlị.

Chekwaa penny na nnukwu mpịakọta na PostgreSQL
Otú ọ dị, ahụmahụ anyị tụgharịrị bụrụ nke na-arụpụta ihe na nke a, ebe ọ bụ na nchekwa nke ihe fọrọ nke nta ka ọ bụrụ nlekota ọ bụla site na ọdịdị ya na-akasị ngwa ngwa-naanị n'ihe gbasara data ndekọ. Ma ọ bụrụ na ị na-eche ka ị ga-esi kụziere nchekwa data ide na diski kama 200MB / s ọkara nke ukwuu - biko n'okpuru pusi.

Obere ihe nzuzo nke nnukwu data

Site na profaịlụ ọrụ ọrụ anyị, ha na-esi n’ebe ndị ahụ efe efe na-efega ya mgbe nile ngwugwu ederede.

Ma kemgbe VLSI mgbagwojunchekwa data nke anyị na-enyocha bụ ngwaahịa nwere ọtụtụ akụkụ nwere usoro data dị mgbagwoju anya, wee jụọ ajụjụ maka arụmọrụ kachasị tụgharịa dị ka nke a “Otu olu” nwere mgbagha algọridim dị mgbagwoju anya. Ya mere, olu nke onye ọ bụla n'otu n'otu nke arịrịọ ma ọ bụ atụmatụ mmezu nke ga-esi na ndekọ na-abịakwute anyị na-aghọ "na nkezi" buru ibu.

Ka anyị leba anya na nhazi nke otu n'ime tebụl anyị na-ede data "raw" n'ime ya - ya bụ, nke a bụ ederede mbụ sitere na ntinye log:

CREATE TABLE rawdata_orig(
  pack -- PK
    uuid NOT NULL
, recno -- PK
    smallint NOT NULL
, dt -- ключ секции
    date
, data -- самое главное
    text
, PRIMARY KEY(pack, recno)
);

Ihe ịrịba ama (ama nkebi, n'ezie, nke a bụ template ngalaba), ebe ihe kachasị mkpa bụ ederede. Mgbe ụfọdụ, oke ụda.

Cheta na nha "anụ ahụ" nke otu ndekọ na PG enweghị ike ịnwe ihe karịrị otu ibe data, mana nha "ezi uche" bụ ihe dị iche. Iji dee uru volumetric (varchar/ederede/bytea) n'ubi, jiri Teknụzụ TOAST:

PostgreSQL na-eji nha ihu akwụkwọ edobere (nke na-abụkarị 8 KB), ọ naghị ekwe ka tuples gbasaa ọtụtụ ibe. Ya mere, ọ gaghị ekwe omume ichekwa nnukwu ọnụ ahịa ubi ozugbo. Iji merie mmachi a, a na-ejikọta ọnụ ahịa ubi buru ibu yana/ma ọ bụ kewaa gafee ọtụtụ ahịrị anụ ahụ. Nke a na-eme onye ọrụ ahụghị ya ma nwee mmetụta dị nta na ọtụtụ koodu nkesa. A maara usoro a dị ka TOAST...

N'ezie, maka tebụl ọ bụla nwere mpaghara "nwere ike buru ibu", na-akpaghị aka A na-emepụta tebụl jikọtara ọnụ na "slicing". ndekọ "nnukwu" ọ bụla na mpaghara 2KB:

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

Ya bụ, ọ bụrụ na anyị ga-ede eriri nwere uru "nnukwu". data, mgbe ahụ, ezigbo ndekọ ga-eme ọ bụghị naanị na tebụl isi na PK ya, kamakwa TOAST na PK ya.

Mbelata mmetụta TOAST

Mana ọtụtụ n'ime ndekọ anyị ka na-adịchaghị ukwuu, kwesịrị ịbanye na 8KB - Kedu ka m ga-esi chekwaa ego na nke a? ..

Nke a bụ ebe njirimara na-abịa na enyemaka anyị STORAGE na kọlụm tebụl:

  • Ọzọ na-enye ohere ma mkpakọ na ichekwa iche iche. Nke a ọkọlọtọ nhọrọ maka ọtụtụ ụdị data kwekọrọ TOAST. Ọ na-ebu ụzọ mee mkpakọ, wee chekwaa ya na mpụga tebụl ma ọ bụrụ na ahịrị ahụ ka buru ibu.
  • n'aka na-enye ohere mkpakọ mana ọ bụghị nchekwa dị iche iche. (N'ezie, a ka ga-arụkwa nchekwa dị iche iche maka kọlụm dị otú ahụ, mana naanị dị ka ebe ikpeazụ, mgbe ọ nweghị ụzọ ọzọ a ga-esi mebie eriri ahụ ka ọ dabara na ibe.)

N'ezie, nke a bụ kpọmkwem ihe anyị chọrọ maka ederede - mpikota onu ya ka o kwere mee, ma ọ bụrụ na ọ dabara ma ọlị, tinye ya na TOAST. Enwere ike ime nke a ozugbo na ofufe, yana otu iwu:

ALTER TABLE rawdata_orig ALTER COLUMN data SET STORAGE MAIN;

Otu esi enyocha mmetụta

Ebe ọ bụ na ntụgharị data na-agbanwe kwa ụbọchị, anyị enweghị ike iji ọnụọgụ zuru oke, mana n'usoro okwu obere òkè Anyị dere ya na TOAST - ọ ka mma. Ma enwere ihe ize ndụ ebe a - ka ibu "anụ ahụ" nke ndekọ nke ọ bụla, "obosara" index na-aghọ, n'ihi na anyị ga-ekpuchi ọtụtụ peeji nke data.

Ngalaba tupu mgbanwe:

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

Ngalaba mgbe mgbanwe:

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

N'ezie, anyị malitere idegara TOAST ugboro 2 obere oge, nke bupụrụ ọ bụghị naanị diski, kamakwa CPU:

Chekwaa penny na nnukwu mpịakọta na PostgreSQL
Chekwaa penny na nnukwu mpịakọta na PostgreSQL
M ga-achọpụta na anyị abawanyela na "ịgụ" diski, ọ bụghị naanị "ịde ihe" - ebe ọ bụ na mgbe ị na-etinye ndekọ na tebụl, anyị ga-agụkwa akụkụ nke osisi nke ọ bụla index iji chọpụta ya. ọnọdụ n'ọdịnihu n'ime ha.

Kedu onye nwere ike ibi ndụ nke ọma na PostgreSQL 11

Mgbe emelitechara na PG11, anyị kpebiri ịga n'ihu na-emegharị TOAST wee chọpụta na ịmalite site na ụdị a, oke. toast_tuple_target:

Koodu nhazi TOAST na-agba naanị mgbe uru ahịrị a ga-echekwa na tebụl karịrị TOAST_TUPLE_THRESHOLD bytes (na-abụkarị 2 KB). Koodu TOAST ga-akpakọ na/ma ọ bụ bupụ ụkpụrụ ubi pụọ na tebụl ruo mgbe uru ahịrị ga-erughị TOAST_TUPLE_TARGET bytes (uru dị iche iche, na-abụkarị 2 KB) ma ọ bụ enweghị ike ibelata nha ya.

Anyị kpebiri na data anyị na-enwekarị bụ “dị mkpụmkpụ” ma ọ bụ “dị ogologo”, yabụ anyị kpebiri ibibi onwe anyị na uru kacha nta enwere ike:

ALTER TABLE rawplan_orig SET (toast_tuple_target = 128);

Ka anyị hụ ka ntọala ọhụrụ ahụ siri metụta nbudata diski ka emezigharịrị:

Chekwaa penny na nnukwu mpịakọta na PostgreSQL
Ọ dịghị njọ! Nkezi kwụ n'ahịrị na diski ebelatala ihe dị ka ugboro 1.5, na diski "na-arụ ọrụ" bụ pasent 20! Ma eleghị anya, nke a n'ụzọ ụfọdụ metụtara CPU?

Chekwaa penny na nnukwu mpịakọta na PostgreSQL
Dịkarịa ala, ọ ka njọ. Agbanyeghị, ọ na-esiri ike ikpe ikpe ma ọ bụrụ na ụdị mpịakọta ndị ahụ enweghị ike ibuli nkezi ibu CPU dị elu 5%.

Site n'ịgbanwe ebe nke okwu, nchikota ... mgbanwe!

Dị ka ị maara, otu penny na-echekwa otu ruble, yana ọnụ ọgụgụ nchekwa anyị ọ bụ ihe 10TB kwa ọnwa ọbụna ntakịrị njikarịcha nwere ike inye ezigbo uru. Ya mere, anyị lebara anya na nhazi anụ ahụ nke data anyị - otú kpọmkwem Oghere “kpokọtara” n'ime ndekọ ahụ nke ọ bụla nke tebụl.

N'ihi na nhazi data nke a kwụ ọtọ n'ihu na-emetụta olu pụta:

Ọtụtụ architectures na-enye nhazi data na oke okwu igwe. Dịka ọmụmaatụ, na sistemụ x32 86-bit, integers (ụdị integer, 4 bytes) ga-adakọ na oke okwu 4-byte, dịka ọnụọgụ ọnụọgụ n'elu mmiri ga-agbakọ okpukpu abụọ (ebe ziri ezi na-ese n'elu mmiri, 8 bytes). Na usoro 64-bit, ọnụọgụ abụọ ga-adaba na oke okwu 8-byte. Nke a bụ ihe ọzọ kpatara enweghị ndakọrịta.

N'ihi nhazigharị, nha nke ahịrị tebụl na-adabere n'usoro nke ubi. Ọtụtụ mgbe, mmetụta a anaghị achọpụta nke ọma, ma n'ọnọdụ ụfọdụ ọ nwere ike ibute mmụba dị ukwuu na nha. Dịka ọmụmaatụ, ọ bụrụ na ị gwakọta char (1) na ogige integer, a ga-enwekarị bytes 3 n'etiti ha.

Ka anyị malite na ụdị sịntetik:

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 байт

Ebee ka bytes ole na ole si na nke mbụ pụta? Ọ dị mfe - 2-byte smallint kwadoro na oke 4-byte tupu ubi na-esote, na mgbe ọ bụ nke ikpeazụ, ọ dịghị ihe ọ bụla na ọ dịghị mkpa ịkwado.

Na tiori, ihe niile dị mma ma ị nwere ike ịhazigharị ubi dịka ịchọrọ. Ka anyị lelee ya na ezigbo data site na iji ihe atụ nke otu tebụl, akụkụ nke kwa ụbọchị nke nwere 10-15GB.

Nhazi izizi:

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)

Ngalaba mgbe ịgbanwere usoro kọlụm - kpọmkwem otu ubi, dị nnọọ iche iche:

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)

A na-ekpebi oke olu nke ngalaba site na ọnụ ọgụgụ nke "eziokwu" ma dabere naanị na usoro mpụga, yabụ ka anyị kewaa nha nke ikpo ahụ (pg_relation_size) site na ọnụ ọgụgụ ndekọ dị na ya - ya bụ, anyị na-enweta Nkezi nha nke ndekọ echekwara n'ezie:

Chekwaa penny na nnukwu mpịakọta na PostgreSQL
Mbelata 6% olu, Ọ dị mma!

Ma ihe niile, n'ezie, abụghị otú rosy - mgbe niile, na ndeksi anyị enweghị ike ịgbanwe usoro nke ubiya mere "n'ozuzu" (pg_total_relation_size) ...

Chekwaa penny na nnukwu mpịakọta na PostgreSQL
... ka ebe a kwa echekwabara 1.5%na-enweghị ịgbanwe otu ahịrị koodu. Ee, ee!

Chekwaa penny na nnukwu mpịakọta na PostgreSQL

Achọpụtara m na nhọrọ dị n'elu maka ịhazi ubi abụghị eziokwu na ọ kacha mma. N'ihi na ị chọghị 'ịdọka' ụfọdụ ngọngọ nke ubi maka ihe ịchọ mma - dịka ọmụmaatụ, di na nwunye (pack, recno), nke bụ PK maka tebụl a.

N'ozuzu, ikpebi nhazi nke "opekempe" nke ubi bụ ọrụ "ike siri ike" dị mfe. Yabụ, ị nwere ike nweta nsonaazụ kacha mma site na data gị karịa nke anyị - nwaa ya!

isi: www.habr.com

Tinye a comment