{"id":79039,"date":"2020-04-23T19:43:26","date_gmt":"2020-04-23T17:43:26","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/ekonomim-kopeechku-na-bolshih-obemah-v-postgresql"},"modified":"2020-04-23T19:43:26","modified_gmt":"2020-04-23T17:43:26","slug":"ekonomim-kopeechku-na-bolshih-obemah-v-postgresql","status":"publish","type":"post","link":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/ekonomim-kopeechku-na-bolshih-obemah-v-postgresql","title":{"rendered":"\u0160et\u0159\u00edme na velk\u00fdch objemech v PostgreSQL","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Pokra\u010duj\u00edc\u00ed t\u00e9ma z\u00e1pisu velk\u00fdch datov\u00fdch proud\u016f, kter\u00e9 bylo vzneseno <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/497008\/\">v p\u0159edchoz\u00edm \u010dl\u00e1nku o partitioningu<\/a><\/noindex>, se zde zam\u011b\u0159\u00edme na zp\u016fsoby, jak\u00fdmi lze <b>sn\u00ed\u017eit \"fyzickou\" velikost ulo\u017een\u00e9ho<\/b> v PostgreSQL a jejich vliv na v\u00fdkonnost serveru.<\/p>\n<p>Bude \u0159e\u010d o <b>nastaven\u00ed TOAST a zarovn\u00e1n\u00ed dat<\/b>. \"V pr\u016fm\u011bru\" tyto metody umo\u017en\u00ed u\u0161et\u0159it ne p\u0159\u00edli\u0161 mnoho zdroj\u016f, ale \u2014 v\u016fbec bez modifikace k\u00f3du aplikace.<\/p>\n<p><img decoding=\"async\" alt=\"\u0160et\u0159\u00edme na velk\u00fdch objemech v PostgreSQL\" src=\"\/wp-content\/uploads\/2020\/04\/4d43b9b43edb10c4c8f13159c7dd1eac.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNicm\u00e9n\u011b, na\u0161e zku\u0161enost byla v tomto ohledu velmi produktivn\u00ed, proto\u017ee \u00falo\u017ei\u0161t\u011b t\u00e9m\u011b\u0159 jak\u00e9hokoli monitorov\u00e1n\u00ed je ze sv\u00e9 podstaty <b>v\u011bt\u0161inou append-only<\/b> pokud jde o zapisovan\u00e1 data. A pokud v\u00e1s zaj\u00edm\u00e1, jak m\u016f\u017eete nau\u010dit datab\u00e1zi zapisovat na disk m\u00edsto <b>200MB\/s<\/b> o polovinu m\u00e9n\u011b \u2014 pros\u00edm pod kat.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Mal\u00e9 tajemstv\u00ed velk\u00fdch dat<\/h2>\n<p>\nPodle profilu pr\u00e1ce <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/487380\/\">na\u0161\u00ed slu\u017eby<\/a><\/noindex>, p\u0159ich\u00e1zej\u00ed mu pravideln\u011b z log\u016f <b>textov\u00e9 bal\u00ed\u010dky<\/b>.<\/p>\n<p>A jeliko\u017e <noindex><a rel=\"nofollow\" href=\"https:\/\/sbis.ru\/all_services\">komplex SBIS<\/a><\/noindex>, jeho\u017e datab\u00e1ze monitorujeme, je mnohokomponentn\u00ed produkt se slo\u017eit\u00fdmi datov\u00fdmi strukturami, tak i dotazy <b>pro dosa\u017een\u00ed maxim\u00e1ln\u00ed v\u00fdkonnosti<\/b> se st\u00e1vaj\u00ed docela \"mnogotominov\u00fdmi\" s komplikovanou algoritmickou logikou. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/486072\/\">Tak\u017ee objem ka\u017ed\u00e9 samostatn\u00e9 instance dotazu nebo v\u00fdsledn\u00e9ho pl\u00e1nu proveden\u00ed v p\u0159ich\u00e1zej\u00edc\u00edm logu se ukazuje b\u00fdt \"v pr\u016fm\u011bru\" dostate\u010dn\u011b velk\u00fd.<\/a><\/noindex>Pod\u00edvejme se na strukturu jedn\u00e9 z tabulek, do kter\u00e9 zapisujeme \"syrov\u00e1\" data \u2014 tedy p\u0159esn\u011b p\u016fvodn\u00ed text ze z\u00e1pisu logu:<\/p>\n<p>CREATE TABLE rawdata_orig(\n  pack -- PK\n    uuid NOT NULL\n, recno -- PK\n    smallint NOT NULL\n, dt -- kl\u00ed\u010d sekce\n    date\n, data -- to nejd\u016fle\u017eit\u011bj\u0161\u00ed\n    text\n, PRIMARY KEY(pack, recno)\n);<\/p>\n<pre><code class=\"sql\">Typick\u00e1 tabulka (ji\u017e partitionovan\u00e1, samoz\u0159ejm\u011b, proto je to \u2014 \u0161ablona sekce), kde to nejd\u016fle\u017eit\u011bj\u0161\u00ed \u2014 je text. N\u011bkdy dost objemn\u00fd.<\/code><\/pre>\n<p>\nP\u0159ipome\u0148me si, \u017ee \"fyzick\u00e1\" velikost jednoho z\u00e1znamu v PG nem\u016f\u017ee zab\u00edrat v\u00edce ne\u017e jednu str\u00e1nku dat, ale \"logick\u00e1\" velikost \u2014 to je \u00fapln\u011b jin\u00e1 v\u011bc. Pro ulo\u017een\u00ed objemn\u00e9 hodnoty do pole (varchar\/text\/bytea) se pou\u017e\u00edv\u00e1<\/p>\n<p>technologie TOAST <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/storage-toast\">technologie TOAST<\/a><\/noindex>:<\/p>\n<blockquote><p>PostgreSQL pou\u017e\u00edv\u00e1 pevnou velikost str\u00e1nky (obvykle 8 kB) a neumo\u017e\u0148uje, aby k tuples zab\u00edraly v\u00edce str\u00e1nek. Proto nen\u00ed mo\u017en\u00e9 p\u0159\u00edmo uchov\u00e1vat velmi velk\u00e9 hodnoty pol\u00ed. Aby se toto omezen\u00ed p\u0159ekonalo, velk\u00e9 hodnoty pol\u00ed se komprimuj\u00ed a\/nebo d\u011bl\u00ed na n\u011bkolik fyzick\u00fdch \u0159\u00e1dk\u016f. To se d\u011bje neznateln\u011b pro u\u017eivatele a m\u00e1 jen mal\u00fd dopad na v\u011bt\u0161inu k\u00f3du serveru. Tato metoda je zn\u00e1m\u00e1 jako TOAST \u2026<\/p><\/blockquote>\n<p>\nVe skute\u010dnosti je pro ka\u017edou tabulku s \"potenci\u00e1ln\u011b velk\u00fdmi\" poli automaticky <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/storage-toast#STORAGE-TOAST-ONDISK\">vytv\u00e1\u0159ena p\u00e1rov\u00e1 tabulka s \"kr\u00e1jen\u00edm\"<\/a><\/noindex> ka\u017ed\u00e9ho \"velk\u00e9ho\" z\u00e1znamu segmenty po 2KB:<\/p>\n<pre><code class=\"sql\">TOAST(\n  chunk_id\n    integer\n, chunk_seq\n    integer\n, chunk_data\n    bytea\n, PRIMARY KEY(chunk_id, chunk_seq)\n);<\/code><\/pre>\n<p>\nTo znamen\u00e1, \u017ee pokud mus\u00edme zapisovat \u0159\u00e1dek s \"velkou\" hodnotou <code>data<\/code>, skute\u010dn\u00fd z\u00e1znam se provede <b>nejen do hlavn\u00ed tabulky a jej\u00edho PK, ale tak\u00e9 do TOASTu a jeho PK<\/b>.<\/p>\n<h4>Sni\u017eujeme vliv TOASTu<\/h4>\n<p>\nAle v\u011bt\u0161ina z\u00e1znam\u016f zdaleka nen\u00ed tak velk\u00e1, <b>m\u011bly by se vej\u00edt do 8KB<\/b> \u2014 jak na tom u\u0161et\u0159it?..<\/p>\n<p>Zde n\u00e1m pom\u00e1h\u00e1 atribut <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/storage-toast#STORAGE-TOAST-ONDISK\"><code>STORAGE<\/code><\/a><\/noindex> u sloupce tabulky:<\/p>\n<blockquote>\n<ul>\n<li><b>EXTENDED<\/b> umo\u017e\u0148uje jak kompresi, tak odd\u011blen\u00e9 ukl\u00e1d\u00e1n\u00ed. To je <b>standardn\u00ed mo\u017enost<\/b> pro v\u011bt\u0161inu typ\u016f dat kompatibiln\u00edch s TOAST. Nejprve se pokou\u0161\u00ed o kompresi, pot\u00e9 - o ulo\u017een\u00ed mimo tabulku, pokud je \u0159\u00e1dek st\u00e1le p\u0159\u00edli\u0161 velk\u00fd.<\/li>\n<li><b>MAIN<\/b> umo\u017e\u0148uje kompresi, ale ne odd\u011blen\u00e9 ukl\u00e1d\u00e1n\u00ed. (Ve skute\u010dnosti se odd\u011blen\u00e9 ukl\u00e1d\u00e1n\u00ed p\u0159esto provede pro takov\u00e9 sloupce, ale pouze <b>jako krajn\u00ed \u0159e\u0161en\u00ed<\/b>, kdy\u017e nen\u00ed jin\u00e1 mo\u017enost, jak zmen\u0161it \u0159\u00e1dek tak, aby se ve\u0161el na str\u00e1nku.)<\/li>\n<\/ul>\n<\/blockquote>\n<p>Ve skute\u010dnosti je to p\u0159esn\u011b to, co pot\u0159ebujeme pro text \u2014 <b>maxim\u00e1ln\u011b komprimovat, a pokud se to st\u00e1le nevejde \u2014 p\u0159esunout do TOAST.<\/b>Lze to prov\u00e9st p\u0159\u00edmo \u201eza chodu\u201c, jedn\u00edm p\u0159\u00edkazem:<\/p>\n<pre><code class=\"sql\">ALTER TABLE rawdata_orig ALTER COLUMN data SET STORAGE MAIN;<\/code><\/pre>\n<p><\/p>\n<h4>Jak posoudit efekt<\/h4>\n<p>\nProto\u017ee ka\u017ed\u00fd den se tok dat m\u011bn\u00ed, nem\u016f\u017eeme porovn\u00e1vat absolutn\u00ed \u010d\u00edsla, ale v relativn\u00edch m\u011b\u0159\u00edtk\u00e1ch \u010d\u00edm <b>men\u0161\u00ed pod\u00edl<\/b> jsme zapsali do TOASTu \u2014 t\u00edm l\u00e9pe. Ale zde je nebezpe\u010d\u00ed \u2014 \u010d\u00edm v\u011bt\u0161\u00ed je n\u00e1\u0161 \u201efyzick\u00fd\u201c objem ka\u017ed\u00e9ho jednotliv\u00e9ho z\u00e1znamu, t\u00edm \u201e\u0161ir\u0161\u00ed\u201c se st\u00e1v\u00e1 index, proto\u017ee mus\u00ed pokr\u00fdt v\u011bt\u0161\u00ed mno\u017estv\u00ed datov\u00fdch stran.<\/p>\n<p>Sekce <b>p\u0159ed zm\u011bnami<\/b>:<\/p>\n<pre><code class=\"plaintext\">heap  = 37GB (39%)\nTOAST = 54GB (57%)\nPK    =  4GB ( 4%)\n<\/code><\/pre>\n<p>\nSekce <b>po zm\u011bn\u00e1ch<\/b>:<\/p>\n<pre><code class=\"plaintext\">heap  = 37GB (67%)\nTOAST = 16GB (29%)\nPK    =  2GB ( 4%)<\/code><\/pre>\n<p>\nVe skute\u010dnosti jsme <b>za\u010dali jsme ps\u00e1t do TOAST dvakr\u00e1t m\u00e9n\u011b<\/b>, co\u017e uvolnilo nejen disk, ale i CPU:<\/p>\n<p><img decoding=\"async\" alt=\"\u0160et\u0159\u00edme na velk\u00fdch objemech v PostgreSQL\" src=\"\/wp-content\/uploads\/2020\/04\/547485eff9c6491ffe4d59e5c81f656d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<img decoding=\"async\" alt=\"\u0160et\u0159\u00edme na velk\u00fdch objemech v PostgreSQL\" src=\"\/wp-content\/uploads\/2020\/04\/6bd3b18146c20959693f961e41fff447.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nR\u00e1d bych poznamenal, \u017ee tak\u00e9 \"\u010d\u00edst\" disk jsme za\u010dali m\u00e9n\u011b, nejen \"ps\u00e1t\", proto\u017ee p\u0159i vlo\u017een\u00ed z\u00e1znamu do n\u011bjak\u00e9 tabulky je t\u0159eba \"p\u0159e\u010d\u00edst\" i \u010d\u00e1st stromu ka\u017ed\u00e9ho z index\u016f, abychom ur\u010dili jej\u00ed budouc\u00ed pozici v nich.<\/p>\n<h2>Komu se dob\u0159e \u017eije na PostgreSQL 11<\/h2>\n<p>\nPo aktualizaci na PG11 jsme se rozhodli pokra\u010dovat v \"lad\u011bn\u00ed\" TOAST a v\u0161imli jsme si, \u017ee od t\u00e9to verze je k dispozici pro nastaven\u00ed parametr <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/11\/storage-toast#STORAGE-TOAST-ONDISK\"><code>toast_tuple_target<\/code><\/a><\/noindex>:<\/p>\n<blockquote><p>K\u00f3d zpracov\u00e1n\u00ed TOAST se spou\u0161t\u00ed pouze tehdy, kdy\u017e velikost \u0159et\u011bzce, kter\u00fd m\u00e1 b\u00fdt ulo\u017een v tabulce, p\u0159ekro\u010d\u00ed TOAST_TUPLE_THRESHOLD bajt\u016f (obvykle je to 2 kB). K\u00f3d TOAST bude komprimovat a\/nebo p\u0159esouvat hodnoty pole mimo tabulku, dokud velikost \u0159et\u011bzce nen\u00ed men\u0161\u00ed ne\u017e TOAST_TUPLE_TARGET bajt\u016f (prom\u011bnn\u00e1 velikost, obvykle tak\u00e9 2 kB) nebo dokud nen\u00ed mo\u017en\u00e9 objem zmen\u0161it.<\/p><\/blockquote>\n<p>Rozhodli jsme se, \u017ee data m\u00e1me obvykle bu\u010f \"zcela kr\u00e1tk\u00e1\", nebo hned \"velmi dlouh\u00e1\", a proto jsme se rozhodli omezit na minim\u00e1ln\u011b mo\u017en\u00e9 hodnoty:<\/p>\n<pre><code class=\"sql\">ALTER TABLE rawplan_orig SET (toast_tuple_target = 128);<\/code><\/pre>\n<p>\nPod\u00edvejme se, jak nov\u00e9 nastaven\u00ed ovlivnilo zat\u00ed\u017een\u00ed disku po p\u0159enastaven\u00ed:<\/p>\n<p><img decoding=\"async\" alt=\"\u0160et\u0159\u00edme na velk\u00fdch objemech v PostgreSQL\" src=\"\/wp-content\/uploads\/2020\/04\/ccaa4879e413a566b362d01582eb8c19.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDob\u0159e! Pr\u016fm\u011brn\u00e1 <b>fronta na disk se sn\u00ed\u017eila<\/b> asi o 1,5 kr\u00e1t, a \"vyu\u017eit\u00ed\" disku \u2014 o 20%! Ale mo\u017en\u00e1 to n\u011bjak ovlivnilo CPU?<\/p>\n<p><img decoding=\"async\" alt=\"\u0160et\u0159\u00edme na velk\u00fdch objemech v PostgreSQL\" src=\"\/wp-content\/uploads\/2020\/04\/f7026e5809853d35c6fb7a8376b9f369.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nMinim\u00e1ln\u011b to ur\u010dit\u011b nebylo hor\u0161\u00ed. A\u010dkoli, t\u011b\u017eko \u0159\u00edct, pokud i takov\u00e9 objemy stejn\u011b nemohou zv\u00fd\u0161it pr\u016fm\u011brn\u00e9 zat\u00ed\u017een\u00ed CPU nad <b>5%<\/b>.<\/p>\n<h2>Zm\u011bna po\u0159ad\u00ed s\u010d\u00edtanc\u016f\u2026 m\u011bn\u00ed sou\u010det!<\/h2>\n<p>\nJak je zn\u00e1mo, hal\u00e9\u0159 \u0161et\u0159\u00ed rubl, a p\u0159i na\u0161ich objemech \u00falo\u017ei\u0161t\u011b kolem <b>10TB\/m\u011bs\u00edc<\/b> i drobn\u00e1 optimalizace m\u016f\u017ee p\u0159in\u00e9st slu\u0161n\u00fd zisk. Proto jsme se zam\u011b\u0159ili na fyzickou strukturu sv\u00fdch dat \u2014 jak konkr\u00e9tn\u011b <b>\"ulo\u017eena\" pole uvnit\u0159 z\u00e1znamu<\/b> ka\u017ed\u00e9 z tabulek.<\/p>\n<p>Proto\u017ee kv\u016fli <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/postgrespro\/blog\/444536\/\">zarovn\u00e1n\u00ed dat<\/a><\/noindex> to p\u0159\u00edmo <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.gitlab.com\/ee\/development\/ordering_table_columns.html\">ovliv\u0148uje v\u00fdsledn\u00fd objem.<\/a><\/noindex>:<\/p>\n<blockquote><p>Mnoho architektur po\u010d\u00edt\u00e1 s zarovn\u00e1n\u00edm dat na hranic\u00edch strojn\u00edch slov. Nap\u0159\u00edklad na 32bitov\u00e9m syst\u00e9mu x86 budou celo\u010d\u00edseln\u00e9 hodnoty (typ integer, zab\u00edr\u00e1 4 bajty) zarovn\u00e1ny na hranici 4-bajtov\u00fdch slov, stejn\u011b jako \u010d\u00edsla s plovouc\u00ed desetinnou \u010d\u00e1rkou dvojit\u00e9 p\u0159esnosti (typ double precision, 8 bajt\u016f). A na 64bitov\u00e9m syst\u00e9mu budou hodnoty typu double zarovn\u00e1ny na hranici 8-bajtov\u00fdch slov. Toto je dal\u0161\u00ed d\u016fvod nekompatibility.<\/p>\n<p>Vzhledem k zarovn\u00e1n\u00ed velikost tabulky z\u00e1vis\u00ed na po\u0159ad\u00ed um\u00edst\u011bn\u00ed pol\u00ed. Obvykle nen\u00ed tento efekt p\u0159\u00edli\u0161 znateln\u00fd, ale v n\u011bkter\u00fdch p\u0159\u00edpadech m\u016f\u017ee v\u00e9st k v\u00fdrazn\u00e9mu zv\u00fd\u0161en\u00ed velikosti. Nap\u0159\u00edklad pokud se sm\u00edchaj\u00ed pole typu char(1) a integer, obvykle mezi nimi zbyte\u010dn\u011b zmiz\u00ed 3 bajty.<\/p><\/blockquote>\n<p>\nZa\u010dn\u011bme se syntetick\u00fdmi modely:<\/p>\n<pre><code class=\"sql\">SELECT pg_column_size(ROW(\n  '0000-0000-0000-0000-0000-0000-0000-0000'::uuid\n, 0::smallint\n, '2019-01-01'::date\n));\n-- 48 bajt\u016f\n\nSELECT pg_column_size(ROW(\n  '2019-01-01'::date\n, '0000-0000-0000-0000-0000-0000-0000-0000'::uuid\n, 0::smallint\n));\n-- 46 bajt\u016f<\/code><\/pre>\n<p>\nOdkud se vzala p\u00e1r zbyte\u010dn\u00fdch bajt\u016f v prvn\u00edm p\u0159\u00edpad\u011b? Je to jednoduch\u00e9 \u2014 <b>2-bajtov\u00fd smallint se zarovn\u00e1 na 4-bajtovou hranici<\/b> p\u0159ed dal\u0161\u00edm polem, a kdy\u017e je posledn\u00ed \u2014 nen\u00ed co zarovn\u00e1vat a nen\u00ed d\u016fvod.<\/p>\n<p>V teorii \u2014 je v\u0161e v po\u0159\u00e1dku a pole lze p\u0159esouvat jak se v\u00e1m zl\u00edb\u00ed. Ov\u011b\u0159me to na re\u00e1ln\u00fdch datech na p\u0159\u00edkladu jedn\u00e9 z tabulek, jej\u00ed\u017e denn\u00ed sekce zab\u00edr\u00e1 10-15GB.<\/p>\n<p>P\u016fvodn\u00ed struktura:<\/p>\n<pre><code class=\"sql\">CREATE TABLE public.plan_20190220\n(\n-- D\u011bd\u011bno z tabulky plan:  pack uuid NOT NULL,\n-- D\u011bd\u011bno z tabulky plan:  recno smallint NOT NULL,\n-- D\u011bd\u011bno z tabulky plan:  host uuid,\n-- D\u011bd\u011bno z tabulky plan:  ts timestamp with time zone,\n-- D\u011bd\u011bno z tabulky plan:  exectime numeric(32,3),\n-- D\u011bd\u011bno z tabulky plan:  duration numeric(32,3),\n-- D\u011bd\u011bno z tabulky plan:  bufint bigint,\n-- D\u011bd\u011bno z tabulky plan:  bufmem bigint,\n-- D\u011bd\u011bno z tabulky plan:  bufdsk bigint,\n-- D\u011bd\u011bno z tabulky plan:  apn uuid,\n-- D\u011bd\u011bno z tabulky plan:  ptr uuid,\n-- D\u011bd\u011bno z tabulky plan:  dt date,\n  CONSTRAINT plan_20190220_pkey PRIMARY KEY (pack, recno),\n  CONSTRAINT chck_ptr CHECK (ptr IS NOT NULL),\n  CONSTRAINT plan_20190220_dt_check CHECK (dt = '2019-02-20'::date)\n)\nINHERITS (public.plan)<\/code><\/pre>\n<p>\nSekce po zm\u011bn\u011b po\u0159ad\u00ed sloupc\u016f \u2014 p\u0159esn\u011b <b>stejn\u00e9 pole, jen jin\u00fd po\u0159\u00e1dek<\/b>:<\/p>\n<pre><code class=\"sql\">CREATE TABLE public.plan_20190221\n(\n-- D\u011bd\u011bno z tabulky plan:  dt date NOT NULL,\n-- D\u011bd\u011bno z tabulky plan:  ts timestamp with time zone,\n-- D\u011bd\u011bno z tabulky plan:  pack uuid NOT NULL,\n-- D\u011bd\u011bno z tabulky plan:  recno smallint NOT NULL,\n-- D\u011bd\u011bno z tabulky plan:  host uuid,\n-- D\u011bd\u011bno z tabulky plan:  apn uuid,\n-- D\u011bd\u011bno z tabulky plan:  ptr uuid,\n-- D\u011bd\u011bno z tabulky plan:  bufint bigint,\n-- D\u011bd\u011bno z tabulky plan:  bufmem bigint,\n-- D\u011bd\u011bno z tabulky plan:  bufdsk bigint,\n-- D\u011bd\u011bno z tabulky plan:  exectime numeric(32,3),\n-- D\u011bd\u011bno z tabulky plan:  duration numeric(32,3),\n  CONSTRAINT plan_20190221_pkey PRIMARY KEY (pack, recno),\n  CONSTRAINT chck_ptr CHECK (ptr IS NOT NULL),\n  CONSTRAINT plan_20190221_dt_check CHECK (dt = '2019-02-21'::date)\n)\nINHERITS (public.plan)<\/code><\/pre>\n<p>\nCelkov\u00fd objem sekce se ur\u010duje po\u010dtem \u201efakt\u016f\u201c a z\u00e1vis\u00ed pouze na vn\u011bj\u0161\u00edch procesech, proto si pod\u011bl\u00edme velikost heap (<code>pg_relation_size<\/code>) na po\u010det z\u00e1znam\u016f v n\u00ed \u2014 tedy z\u00edsk\u00e1me <b>pr\u016fm\u011brnou velikost skute\u010dn\u011b ulo\u017een\u00e9ho z\u00e1znamu<\/b>:<\/p>\n<p><img decoding=\"async\" alt=\"\u0160et\u0159\u00edme na velk\u00fdch objemech v PostgreSQL\" src=\"\/wp-content\/uploads\/2020\/04\/06be2d7d70d223e7678f9a478e4c293f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<b>Minus 6% objemu<\/b>, v\u00fdborn\u011b!<\/p>\n<p>Ale samoz\u0159ejm\u011b to nen\u00ed tak r\u016f\u017eov\u00e9 \u2014 proto\u017ee <b>v indexech po\u0159ad\u00ed pol\u00ed zm\u011bnit nem\u016f\u017eeme<\/b>, a proto \u201ecelkov\u011b\u201c (<code>pg_total_relation_size<\/code>)\u2026<\/p>\n<p><img decoding=\"async\" alt=\"\u0160et\u0159\u00edme na velk\u00fdch objemech v PostgreSQL\" src=\"\/wp-content\/uploads\/2020\/04\/8beff38e5034fc0d40665b75cb3b3625.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n\u2026 p\u0159ece jen i tady <b>u\u0161et\u0159ili 1.5%<\/b>, ani\u017e bychom zm\u011bnili jedin\u00fd \u0159\u00e1dek k\u00f3du. Tak\u017ee ano!<\/p>\n<p><img decoding=\"async\" alt=\"\u0160et\u0159\u00edme na velk\u00fdch objemech v PostgreSQL\" src=\"\/wp-content\/uploads\/2020\/04\/10f4a2151465a38bf45823a5d360302b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>R\u00e1d bych poznamenal, \u017ee v\u00fd\u0161e uveden\u00e1 varianta uspo\u0159\u00e1d\u00e1n\u00ed pol\u00ed \u2014 nen\u00ed jist\u00e9, \u017ee je ta nejoptim\u00e1ln\u011bj\u0161\u00ed. Proto\u017ee n\u011bkter\u00e9 bloky pol\u00ed nechceme \u201eroztrhat\u201c u\u017e z estetick\u00fdch d\u016fvod\u016f \u2014 nap\u0159\u00edklad p\u00e1r <code>(pack, recno)<\/code>, kter\u00e1 je PK pro tuto tabulku.<\/p>\n<p>Celkov\u011b v\u0161ak definice \u201eminim\u00e1ln\u00edho\u201c uspo\u0159\u00e1d\u00e1n\u00ed pol\u00ed je pom\u011brn\u011b jednoduch\u00fd \u201eprobranka\u201c \u00fakol. Proto m\u016f\u017eete na sv\u00fdch datech dos\u00e1hnout v\u00fdsledk\u016f je\u0161t\u011b lep\u0161\u00edch ne\u017e my \u2014 zkuste!<br \/>\n<br \/>Zdroj: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/tensor\/blog\/498292\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044f \u0442\u0435\u043c\u0443 \u0437\u0430\u043f\u0438\u0441\u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u043e\u0434\u043d\u044f\u0442\u0443\u044e \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435\u0439 \u043f\u0440\u043e \u0441\u0435\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0432 \u044d\u0442\u043e\u0439 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u00ab\u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0439\u00bb \u0440\u0430\u0437\u043c\u0435\u0440 \u0445\u0440\u0430\u043d\u0438\u043c\u043e\u0433\u043e \u0432 PostgreSQL, \u0438 \u0438\u0445 \u0432\u043b\u0438\u044f\u043d\u0438\u0435 \u043d\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440\u0430. \u0420\u0435\u0447\u044c \u043f\u043e\u0439\u0434\u0435\u0442 \u043f\u0440\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 TOAST \u0438 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445. \u00ab\u0412 \u0441\u0440\u0435\u0434\u043d\u0435\u043c\u00bb \u044d\u0442\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0442 \u0441\u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442\u044c \u043d\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432, \u0437\u0430\u0442\u043e \u2014 \u0432\u043e\u043e\u0431\u0449\u0435 \u0431\u0435\u0437 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043a\u043e\u0434\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041e\u0434\u043d\u0430\u043a\u043e, [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":79040,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-79039","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044f \u0442\u0435\u043c\u0443 \u0437\u0430\u043f\u0438\u0441\u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u043e\u0434\u043d\u044f\u0442\u0443\u044e \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435\u0439 \u043f\u0440\u043e \u0441\u0435\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0432 \u044d\u0442\u043e\u0439 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043c\u043e\u0436\u043d\u043e.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/ekonomim-kopeechku-na-bolshih-obemah-v-postgresql\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"cs_CZ\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u042d\u043a\u043e\u043d\u043e\u043c\u0438\u043c \u043a\u043e\u043f\u0435\u0435\u0447\u043a\u0443 \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043e\u0431\u044a\u0435\u043c\u0430\u0445 \u0432 PostgreSQL | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044f \u0442\u0435\u043c\u0443 \u0437\u0430\u043f\u0438\u0441\u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u043e\u0434\u043d\u044f\u0442\u0443\u044e \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435\u0439 \u043f\u0440\u043e \u0441\u0435\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0432 \u044d\u0442\u043e\u0439 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043c\u043e\u0436\u043d\u043e.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/ekonomim-kopeechku-na-bolshih-obemah-v-postgresql\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-04-23T17:43:26+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-04-23T17:43:26+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47 \u0160et\u0159\u00edme korunku na velk\u00fdch objemech v PostgreSQL | ProHoster","description":"Pokra\u010dujeme v t\u00e9matu z\u00e1znamu velk\u00fdch datov\u00fdch tok\u016f, kter\u00e9 bylo nastoleno v p\u0159edchoz\u00edm \u010dl\u00e1nku o d\u011blen\u00ed, zde prozkoum\u00e1me zp\u016fsoby, jak\u00fdmi to lze prov\u00e9st.","canonical_url":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/ekonomim-kopeechku-na-bolshih-obemah-v-postgresql","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"cs_CZ","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u042d\u043a\u043e\u043d\u043e\u043c\u0438\u043c \u043a\u043e\u043f\u0435\u0435\u0447\u043a\u0443 \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043e\u0431\u044a\u0435\u043c\u0430\u0445 \u0432 PostgreSQL | ProHoster","og:description":"\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044f \u0442\u0435\u043c\u0443 \u0437\u0430\u043f\u0438\u0441\u0438 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u043e\u0434\u043d\u044f\u0442\u0443\u044e \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435\u0439 \u043f\u0440\u043e \u0441\u0435\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0432 \u044d\u0442\u043e\u0439 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043c\u043e\u0436\u043d\u043e.","og:url":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/ekonomim-kopeechku-na-bolshih-obemah-v-postgresql","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-04-23T17:43:26+00:00","article:modified_time":"2020-04-23T17:43:26+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"79039","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 16:46:33","updated":"2022-09-28 06:02:32","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/79039","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/comments?post=79039"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/79039\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media\/79040"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media?parent=79039"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/categories?post=79039"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/tags?post=79039"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}