Tiakina he pene mo nga pukapuka nui i PostgreSQL

Te haere tonu i te kaupapa o te tuhi i nga awa raraunga nui i whakaarahia e Tuhinga o mua mo te wehewehe, i tenei ka titiro tatou ki nga huarahi ka taea e koe whakaitihia te rahi "tinana" o te rongoa i roto i te PostgreSQL, me o raatau paanga ki te mahi a te tūmau.

Ka korero tatou mo Tautuhinga TOAST me te tirohanga raraunga. "I te toharite," kaore enei tikanga e whakaora i nga rauemi maha, engari me te kore e whakarereke i te waehere tono.

Tiakina he pene mo nga pukapuka nui i PostgreSQL
Heoi, i puta mai to maatau wheako he tino whai hua mo tenei ahuatanga, na te mea ko te rokiroki o te nuinga o nga mahi tirotiro na tona ahuatanga te nuinga apiti-anake i runga i nga raraunga kua tuhia. A, ki te whakaaro koe me pehea e taea ai e koe te whakaako i te papaa raraunga ki te tuhi ki te kōpae 200MB / s haurua te nui - tēnā i raro i te ngeru.

Nga mea ngaro iti o nga raraunga nui

Ma te tohu mahi ta tatou ratonga, he rite tonu te rere ki a ia i nga rua pōkai kuputuhi.

Ana mai ano VLSI matatiniko tana papaunga raraunga ka tirohia e matou he hua-waahanga maha me nga hanganga raraunga uaua, katahi ka patai mo te tino mahi ka puta penei "nui-rahi" me te arorau algorithmic matatini. Na ko te rōrahi o ia tauira takitahi o te tono me te mahere mahi i puta mai i te raarangi ka tae mai ki a maatau ka puta he "i te toharite" he nui.

Me titiro ki te hanganga o tetahi o nga ripanga ka tuhia e tatou nga raraunga "mata" - ara, koinei te tuhinga taketake mai i te urunga rangitaki:

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

He tohu angamaheni (kua wehea, o te akoranga, no reira he tauira waahanga tenei), ko te mea nui ko te tuhinga. I etahi wa ka tino nui.

Kia maumahara ko te rahi "a-tinana" o te rekoata kotahi i roto i te PG kaore e taea te noho neke atu i te kotahi wharangi o nga raraunga, engari ko te rahi "arorau" he mea tino rereke. Hei tuhi uara rōrahi (varchar/text/bytea) ki tētahi āpure, whakamahia Hangarau TOAST:

Ka whakamahi a PostgreSQL i te rahi o te wharangi (ko te tikanga 8 KB), karekau e tuku i nga tuple ki te hora i nga wharangi maha. Na reira, kaore e taea te penapena tika i nga uara mara nui rawa atu. Hei hinga i tenei herenga, ka kopakihia nga uara mara nui, ka wehea ranei ki nga raina tinana maha. Ka puta tenei kaore i te mohiohia e te kaiwhakamahi me te iti o te paanga ki te nuinga o nga waehere tūmau. Ko tenei tikanga e mohiotia ana ko TOAST...

Inaa, mo ia tepu me nga mara "he nui pea", aunoa ka hangaia he ripanga takirua me te "parapara". ia rekoata "nui" ki nga waahanga 2KB:

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

Arā, mena ka tuhia he aho me te uara "nui". data, katahi ka puta te rekoata tuturu ehara ki te tepu matua me tana PK anake, engari ki TOAST me tana PK.

Te whakaiti i te awe TOAST

Engari ko te nuinga o a maatau rekoata kaore ano i te rahi, me uru ki te 8KB - Me pehea taku penapena moni mo tenei?..

I konei ka tae mai te huanga ki te awhina STORAGE i te tīwae ripanga:

  • HE WHAKAMAHI ka taea e rua te kōpeketanga me te rokiroki motuhake. Tenei kōwhiringa paerewa mo te nuinga o nga momo raraunga whai TOAST. I te tuatahi ka ngana ki te mahi kōpeketanga, katahi ka penapena ki waho o te tepu mena he nui rawa te rarangi.
  • HAND ka taea te kōpeke engari kaua e wehea te rokiroki. (Ae ra, ka mahia tonu te rokiroki motuhake mo aua pou, engari anake hei huarahi whakamutunga, ina karekau he huarahi kee hei whakaheke i te aho kia pai ai ki te wharangi.)

Inaa, koinei tonu te mea e hiahiatia ana mo te tuhinga - kōpeketia i te mea e taea ana, a ki te kore e pai, hoatu ki roto TOAST. Ka taea te mahi tika i runga i te rere, me te whakahau kotahi:

ALTER TABLE rawdata_orig ALTER COLUMN data SET STORAGE MAIN;

Me pehea te arotake i te paanga

I te mea ka huri te rerenga raraunga i ia ra, kaore e taea te whakataurite i nga tau tino, engari i runga i nga tikanga wahi iti I tuhia e matou ki te TOAST - he pai ake. Engari he raru kei konei - ko te nui ake o te rōrahi "tinana" o ia rekoata takitahi, ka "whanui" te taurangi, na te mea he nui ake nga wharangi o nga raraunga ka kapi.

Wāhanga i mua i nga huringa:

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

Wāhanga i muri i nga huringa:

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

I roto i te meka, tatou I timata te tuhi ki TOAST 2 nga wa iti ake, i wetewete i te kōpae anake, engari ko te PTM hoki:

Tiakina he pene mo nga pukapuka nui i PostgreSQL
Tiakina he pene mo nga pukapuka nui i PostgreSQL
Ka kite ahau kua iti ake taatau ki te "panui" i te kōpae, ehara i te "tuhi" anake - na te mea ka whakauruhia he rekoata ki roto i te teepu, me "panui" tetahi waahanga o te rakau o ia taurangi hei whakatau tūnga a meake nei i roto ia ratou.

Ko wai ka noho pai i runga i te PostgreSQL 11

Whai muri i te whakahou ki te PG11, i whakatau matou ki te haere tonu ki te "whakatangi" TOAST me te kite i timata mai i tenei putanga ka waatea te tawhā mo te whakatangi. toast_tuple_target:

Ka mura noa te waehere tukatuka TOAST ina nui ake te uara haupae hei penapena ki te ripanga i te TOAST_TUPLE_THRESHOLD paita (ko te tikanga 2 KB). Ko te waehere TOAST ka kopiri, ka nekehia ranei nga uara mara ki waho o te ripanga kia iti iho te uara haupae i te TOAST_TUPLE_TARGET paita (he uara taurangi, he 2 KB te tikanga) kare ranei e taea te whakaiti te rahi.

I whakatau matou ko nga raraunga kei a matou i te nuinga o te waa he "tino poto" ranei "tino roa", no reira ka whakatau matou ki te whakawhāiti i a matou ki te iti rawa o te uara:

ALTER TABLE rawplan_orig SET (toast_tuple_target = 128);

Tirohia te pehea i pa ai nga tautuhinga hou ki te uta kōpae i muri i te whirihora ano:

Tiakina he pene mo nga pukapuka nui i PostgreSQL
Ehara i te kino! Wawaenga kua heke te tūtira ki te kōpae tata ki te 1.5 nga wa, a ko te kōpae "mahi" he 20 ōrau! Engari tera pea i pa ki te PTM?

Tiakina he pene mo nga pukapuka nui i PostgreSQL
I te iti rawa kaore i tino kino. Ahakoa, he uaua ki te whakatau mena kaore e taea e enei pukapuka te whakanui ake i te utaina PTM toharite 5%.

Ma te huri i nga waahi o nga kupu, ka huri te tapeke...!

E mohio ana koe, he pene te penapena i te ruble, me a maatau pukapuka rokiroki e pa ana 10TB/marama ahakoa he iti te arotautanga ka whai hua pai. Na reira, i aro atu matou ki te hanganga-a-tinana o a matou raraunga - me pehea "whakapae" nga mara i roto i te rekoata ia o nga tepu.

No te mea na tīaroaro raraunga he tika tonu tenei ka pa ki te rōrahi ka puta:

He maha nga hoahoanga e whakarato ana i nga raraunga mo nga rohe kupu miihini. Hei tauira, i runga i te punaha 32-bit x86, ko nga tauoti (momo tauoti, 4 paita) ka whakatiarohia ki runga i te rohenga kupu 4-paita, ka pera ano me te rua o nga tau ira maanu (te rua nga paita maanu, 8 nga paita). A, i runga i te punaha moka-64, ko nga uara takirua ka whakahaangai ki nga rohe kupu 8-paita. He take ano tenei mo te kore hototahi.

Nā te tīaroaro, ka whakawhirinaki te rahi o te haupae ripanga ki te raupapa o ngā āpure. I te nuinga o nga wa kaore e tino kitea tenei paanga, engari i etahi wa ka nui ake te rahi o te rahi. Hei tauira, ki te whakakotahi koe i nga mara tohu (1) me nga mara tauoti, ka 3 nga paita ka moumou i waenga.

Me timata me nga tauira waihanga:

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

I ahu mai i hea etahi paita taapiri i te keehi tuatahi? He ngawari noa - 2-paita iti e tirohia ana ki te rohe 4-paita i mua i te mara e whai ake nei, a, i te wa ko te mea whakamutunga, kaore he mea me te kore e tika kia whakahāngai.

I roto i te ariā, he pai nga mea katoa, ka taea e koe te whakarereke i nga mara ki taau e pai ai. Me tirotirohia i runga i nga raraunga tuuturu ma te whakamahi i te tauira o tetahi o nga tepu, ko te waahanga o ia ra kei te 10-15GB.

Hanganga tuatahi:

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)

Wāhanga i muri i te huri i te raupapa tīwae - tika he rite nga mara, he rereke noa te raupapa:

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)

Ko te rahinga o te waahanga ka whakatauhia e te maha o nga "meka" ka whakawhirinaki ki nga tikanga o waho anake, na me wehewehe te rahi o te puranga (pg_relation_size) ma te maha o nga rekoata kei roto - ara, ka whiwhi tatou te rahi toharite o te rekoata rongoa:

Tiakina he pene mo nga pukapuka nui i PostgreSQL
Minu 6% rōrahi, Nui!

Engari ko nga mea katoa, ko te tikanga, ehara i te mea tino maamaa - i muri i nga mea katoa, i roto i nga tohu kaore e taea te whakarereke i te raupapa o nga mara, na reira “i te nuinga” (pg_total_relation_size) ...

Tiakina he pene mo nga pukapuka nui i PostgreSQL
... kei konei ano hoki i tiakina 1.5%me te kore e huri i tetahi rarangi waehere. Ae, ae!

Tiakina he pene mo nga pukapuka nui i PostgreSQL

Ka kite ahau ko te waahanga o runga ake mo te whakarite mara ehara i te mea ko te mea tino pai rawa atu. Na te mea kaore koe e pai ki te "haea" etahi poraka mara mo nga take ataahua - hei tauira, he tokorua (pack, recno), ko te PK mo tenei tepu.

I te nuinga o te waa, ko te whakatau i te whakaritenga "iti rawa" o nga mara he mahi "kaha kaha". Na reira, ka taea e koe te whiwhi hua pai ake i o raraunga i a maatau - whakamatauria!

Source: will.com

Tāpiri i te kōrero