{"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\/ro\/blog\/administrirovanie\/ekonomim-kopeechku-na-bolshih-obemah-v-postgresql","title":{"rendered":"Recent, am povestit cum, folosind re\u021bete standard, s\u0103 cre\u0219tem performan\u021ba interog\u0103rilor SQL \u201ela citire\u201d din.","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Continu\u00e2nd tema \u00eenregistr\u0103rii fluxurilor mari de date, ridicat\u0103 <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/497008\/\">\u00een articolul precedent despre sec\u021bionare<\/a><\/noindex>, \u00een acesta vom analiza modalit\u0103\u021bile prin care putem <b>reduce \u201edimensiunea fizic\u0103\u201d a datelor stocate<\/b> \u00een PostgreSQL \u0219i influen\u021ba lor asupra performan\u021bei serverului.<\/p>\n<p>Vor fi discutate <b>set\u0103rile TOAST \u0219i alinierea datelor<\/b>. \u201e\u00cen medie\u201d, aceste modalit\u0103\u021bi vor permite economisirea nu prea multor resurse, dar \u2014 f\u0103r\u0103 nicio modificare a codului aplica\u021biei.<\/p>\n<p><img decoding=\"async\" alt=\"Recent, am povestit cum, folosind re\u021bete standard, s\u0103 cre\u0219tem performan\u021ba interog\u0103rilor SQL \u201ela citire\u201d din.\" src=\"\/wp-content\/uploads\/2020\/04\/4d43b9b43edb10c4c8f13159c7dd1eac.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nCu toate acestea, experien\u021ba noastr\u0103 s-a dovedit a fi destul de productiv\u0103 \u00een acest sens, deoarece stocarea aproape oric\u0103rei monitoriz\u0103ri este, prin natura sa, <b>\u00een cea mai mare parte, append-only<\/b> din punctul de vedere al datelor scrise. \u0218i dac\u0103 v\u0103 intereseaz\u0103 cum se poate \u00eenv\u0103\u021ba baza s\u0103 scrie pe disc \u00eentr-o vitez\u0103 de <b>200MB\/s<\/b> mult mai mic\u0103 \u2014 v\u0103 rog s\u0103 citi\u021bi \u00een continuare.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Secrete mici despre Big Data<\/h2>\n<p>\nConform profilului de activitate <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/487380\/\">al serviciului nostru<\/a><\/noindex>, acesta prime\u0219te \u00een mod regulat din loguri <b>pachete de text<\/b>.<\/p>\n<p>\u0218i deoarece <noindex><a rel=\"nofollow\" href=\"https:\/\/sbis.ru\/all_services\">complexul SBIS<\/a><\/noindex>, ale c\u0103rui baze de date le monitoriz\u0103m, este un produs multicomponent cu structuri complexe de date, cererile <b>pentru a atinge performan\u021ba maxim\u0103<\/b> au devenit astfel <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/486072\/\">\u201emultivoluminoase\u201d cu o logic\u0103 algeritmic\u0103 complex\u0103.<\/a><\/noindex>Astfel, volumul fiec\u0103rui exemplu de cerere sau al planului de execu\u021bie rezultat din logul care ne sose\u0219te este \u201e\u00een medie\u201d destul de mare.<\/p>\n<p>S\u0103 ne uit\u0103m la structura uneia dintre tabele, \u00een care scriem datele \u201eneprelucrate\u201d \u2014 adic\u0103 textul original din \u00eenregistrarea logului:<\/p>\n<pre><code class=\"sql\">CREATE TABLE rawdata_orig(\n  pack -- PK\n    uuid NOT NULL\n, recno -- PK\n    smallint NOT NULL\n, dt -- cheia sec\u021biunii\n    date\n, data -- cel mai important\n    text\n, PRIMARY KEY(pack, recno)\n);<\/code><\/pre>\n<p>\nEste o tabel\u0103 tipic\u0103 (deja sec\u021bionat\u0103, desigur, prin urmare acesta este un \u0219ablon de sec\u021biune), unde cel mai important este \u2014 textul. Uneori este destul de voluminos.<\/p>\n<p>S\u0103 ne amintim c\u0103 dimensiunea \u201efizic\u0103\u201d a unei \u00eenregistr\u0103ri \u00een PG nu poate ocupa mai mult de o pagin\u0103 de date, dar dimensiunea \u201elogic\u0103\u201d este o alt\u0103 poveste. Pentru a scrie o valoare voluminoas\u0103 \u00eentr-un c\u00e2mp (varchar\/text\/bytea) se utilizeaz\u0103 <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/storage-toast\">tehnologia TOAST<\/a><\/noindex>:<\/p>\n<blockquote><p>PostgreSQL utilizeaz\u0103 o dimensiune fix\u0103 a paginii (de obicei 8 KB) \u0219i nu permite ca tuplurile s\u0103 ocupe mai multe pagini. Prin urmare, nu este posibil s\u0103 stoca\u021bi direct valori foarte mari ale c\u00e2mpurilor. Pentru a dep\u0103\u0219i aceast\u0103 limitare, valorile mari ale c\u00e2mpurilor sunt comprimate \u0219i\/sau fragmentate \u00een mai multe linii fizice. Acest lucru se \u00eent\u00e2mpl\u0103 f\u0103r\u0103 ca utilizatorul s\u0103 observe \u0219i afecteaz\u0103 \u00eentr-o m\u0103sur\u0103 nesemnificativ\u0103 majoritatea codului serverului. Aceast\u0103 metod\u0103 este cunoscut\u0103 sub numele de TOAST &#8230;<\/p><\/blockquote>\n<p>\nDe fapt, pentru fiecare tabel cu c\u00e2mpuri \u201epoten\u021bial mari\u201d, se creeaz\u0103 automat <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/storage-toast#STORAGE-TOAST-ONDISK\">o tabel\u0103 suplimentar\u0103 cu \u201efelii\u201d<\/a><\/noindex> fiecare \u00eenregistrare \u201emare\u201d segmentat\u0103 \u00een buc\u0103\u021bi de 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>\nAsta \u00eenseamn\u0103 c\u0103, atunci c\u00e2nd trebuie s\u0103 scriem un r\u00e2nd cu o valoare \u201emare\u201d, <code>data<\/code>\u00eenregistrarea real\u0103 va avea loc <b>nu doar \u00een tabela principal\u0103 \u0219i cheia ei primar\u0103, ci \u0219i \u00een TOAST \u0219i cheia sa primar\u0103<\/b>.<\/p>\n<h4>Reducerea impactului TOAST<\/h4>\n<p>\nDar majoritatea \u00eenregistr\u0103rilor noastre nu sunt at\u00e2t de mari, <b>ar trebui s\u0103 se \u00eencadreze \u00een 8KB<\/b> \u2014 cum putem economisi pe acest lucru?..<\/p>\n<p>Aici ne ajut\u0103 atributul <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgresql\/12\/storage-toast#STORAGE-TOAST-ONDISK\"><code>STORAGE<\/code><\/a><\/noindex> de la coloana tabelului:<\/p>\n<blockquote>\n<ul>\n<li><b>EXTENDED<\/b> permite at\u00e2t comprimarea, c\u00e2t \u0219i stocarea separat\u0103. Aceasta <b>este varianta standard<\/b> pentru majoritatea tipurilor de date compatibile cu TOAST. Mai \u00eent\u00e2i se \u00eencearc\u0103 comprimarea, apoi \u2014 stocarea \u00een afara tabelului, dac\u0103 r\u00e2ndul este \u00een continuare prea mare.<\/li>\n<li><b>MAIN<\/b> permite comprimarea, dar nu stocarea separat\u0103. (De fapt, stocarea separat\u0103 va fi efectuat\u0103 pentru aceste coloane, dar doar <b>ca ultim\u0103 solu\u021bie<\/b>, c\u00e2nd nu exist\u0103 alt\u0103 metod\u0103 de a reduce r\u00e2ndul, astfel \u00eenc\u00e2t s\u0103 \u00eencap\u0103 \u00een pagin\u0103.)<\/li>\n<\/ul>\n<\/blockquote>\n<p>De fapt, tocmai asta avem nevoie pentru text \u2014 <b>s\u0103 comprim\u0103m la maximum \u0219i, dac\u0103 tot nu \u00eencap, s\u0103 mut\u0103m \u00een TOAST.<\/b>Acest lucru se poate face direct \u201e\u00een zbor\u201d, cu o singur\u0103 comand\u0103:<\/p>\n<pre><code class=\"sql\">ALTER TABLE rawdata_orig ALTER COLUMN data SET STORAGE MAIN;<\/code><\/pre>\n<p><\/p>\n<h4>Cum s\u0103 evalu\u0103m efectul<\/h4>\n<p>\nDeoarece fluxul de date se schimb\u0103 \u00een fiecare zi, nu putem compara cifrele absolute, dar \u00een termeni relativi, cu c\u00e2t <b>o propor\u021bie mai mic\u0103<\/b> am scris \u00een TOAST \u2014 cu at\u00e2t mai bine. Dar aici exist\u0103 un risc \u2014 cu c\u00e2t volumul \u201efizic\u201d al fiec\u0103rei \u00eenregistr\u0103ri individuale este mai mare, cu at\u00e2t \u201emai larg\u201d devine indexul, deoarece este nevoie s\u0103 acopere un num\u0103r mai mare de pagini de date.<\/p>\n<p>Sec\u021biunea <b>\u00eenainte de modific\u0103ri<\/b>:<\/p>\n<pre><code class=\"plaintext\">heap  = 37GB (39%)\nTOAST = 54GB (57%)\nPK    =  4GB ( 4%)\n<\/code><\/pre>\n<p>\nSec\u021biunea <b>dup\u0103 modific\u0103ri<\/b>:<\/p>\n<pre><code class=\"plaintext\">heap  = 37GB (67%)\nTOAST = 16GB (29%)\nPK    =  2GB ( 4%)<\/code><\/pre>\n<p>\nDe fapt, am <b>\u00eenceput s\u0103 scriem \u00een TOAST de 2 ori mai rar<\/b>, care a degrevat nu doar discul, ci \u0219i CPU-ul:<\/p>\n<p><img decoding=\"async\" alt=\"Recent, am povestit cum, folosind re\u021bete standard, s\u0103 cre\u0219tem performan\u021ba interog\u0103rilor SQL \u201ela citire\u201d din.\" src=\"\/wp-content\/uploads\/2020\/04\/547485eff9c6491ffe4d59e5c81f656d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<img decoding=\"async\" alt=\"Recent, am povestit cum, folosind re\u021bete standard, s\u0103 cre\u0219tem performan\u021ba interog\u0103rilor SQL \u201ela citire\u201d din.\" src=\"\/wp-content\/uploads\/2020\/04\/6bd3b18146c20959693f961e41fff447.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nObserv c\u0103 am \u00eenceput s\u0103 \u201ecit\u0103m\u201d mai pu\u021bin discul, nu doar s\u0103 \u201escriem\u201d \u2014 deoarece, atunci c\u00e2nd inser\u0103m o \u00eenregistrare \u00eentr-un tabel, trebuie s\u0103 \u201ecitim\u201d \u0219i o parte din arborele fiec\u0103rui index pentru a-i determina viitoarea pozi\u021bie \u00een acestea.<\/p>\n<h2>Cui \u00eei place s\u0103 tr\u0103iasc\u0103 pe PostgreSQL 11<\/h2>\n<p>\nDup\u0103 actualizarea la PG11, am decis s\u0103 continu\u0103m \u201etuningul\u201d TOAST \u0219i am observat c\u0103, \u00eencep\u00e2nd cu aceast\u0103 versiune, a devenit disponibil pentru configurare parametrul <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>Codul de procesare TOAST se activeaz\u0103 doar atunci c\u00e2nd dimensiunea valorii \u0219irului care trebuie stocat\u0103 \u00een tabel dep\u0103\u0219e\u0219te TOAST_TUPLE_THRESHOLD bytes (de obicei, 2 KB). Codul TOAST va comprima \u0219i\/sau va muta valorile c\u00e2mpului \u00een afara tabelului p\u00e2n\u0103 c\u00e2nd dimensiunea \u0219irului devine mai mic\u0103 dec\u00e2t TOAST_TUPLE_TARGET bytes (o valoare variabil\u0103, de obicei, tot 2 KB) sau p\u00e2n\u0103 c\u00e2nd nu mai este posibil s\u0103 se reduc\u0103 dimensiunea.<\/p><\/blockquote>\n<p>Am decis c\u0103 datele noastre sunt de obicei fie \u201efoarte scurte\u201d, fie \u201efoarte lungi\u201d, a\u0219a c\u0103 am decis s\u0103 ne limit\u0103m la cea mai mic\u0103 valoare posibil\u0103:<\/p>\n<pre><code class=\"sql\">ALTER TABLE rawplan_orig SET (toast_tuple_target = 128);<\/code><\/pre>\n<p>\nHaide\u021bi s\u0103 vedem cum noile set\u0103ri au influen\u021bat \u00eenc\u0103rcarea discului dup\u0103 reconfigurare:<\/p>\n<p><img decoding=\"async\" alt=\"Recent, am povestit cum, folosind re\u021bete standard, s\u0103 cre\u0219tem performan\u021ba interog\u0103rilor SQL \u201ela citire\u201d din.\" src=\"\/wp-content\/uploads\/2020\/04\/ccaa4879e413a566b362d01582eb8c19.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNu r\u0103u! Media <b>\u00eent\u00e2rziere la disc s-a redus<\/b> cu aproximativ 1.5 ori, iar \u201eocuparea\u201d discului \u2014 cu 20%! Dar poate c\u0103 aceasta a influen\u021bat \u0219i CPU-ul?<\/p>\n<p><img decoding=\"async\" alt=\"Recent, am povestit cum, folosind re\u021bete standard, s\u0103 cre\u0219tem performan\u021ba interog\u0103rilor SQL \u201ela citire\u201d din.\" src=\"\/wp-content\/uploads\/2020\/04\/f7026e5809853d35c6fb7a8376b9f369.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nCel pu\u021bin, clar nu a fost mai r\u0103u. Totu\u0219i, e greu de spus, dac\u0103 chiar \u0219i aceste volume nu pot ridica \u00eenc\u0103rcarea medie a CPU-ului mai sus <b>5%<\/b>.<\/p>\n<h2>De la schimbarea locurilor se schimb\u0103 suma\u2026<\/h2>\n<p>\nDup\u0103 cum se \u0219tie, un ban economise\u0219te un leu, iar cu volumele noastre de stocare de aproximativ <b>10TB\/lun\u0103<\/b> chiar \u0219i o mic\u0103 optimizare poate aduce un profit considerabil. De aceea, ne-am concentrat asupra structurii fizice a datelor noastre \u2014 cum sunt concret <b>\u201earanjate\u201d c\u00e2mpurile \u00een fiecare \u00eenregistrare<\/b> a fiec\u0103rui tabel.<\/p>\n<p>Pentru c\u0103 din cauza <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/postgrespro\/blog\/444536\/\">aliniamentului datelor<\/a><\/noindex> acesta afecteaz\u0103 direct <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.gitlab.com\/ee\/development\/ordering_table_columns.html\">volumul rezultat<\/a><\/noindex>:<\/p>\n<blockquote><p>Multe arhitecturi prev\u0103d alinierea datelor pe grani\u021bele cuvintelor ma\u0219in\u0103. De exemplu, pe un sistem x86 pe 32 de bi\u021bi, numerele \u00eentregi (tip integer, care ocup\u0103 4 byte) vor fi aliniate pe limita cuvintelor de 4 byte, la fel ca \u0219i numerele \u00een virgul\u0103 mobil\u0103 cu dubl\u0103 precizie (tip double precision, 8 byte). Iar pe un sistem pe 64 de bi\u021bi, valorile double vor fi aliniate pe limita cuvintelor de 8 byte. Aceasta este o alt\u0103 cauz\u0103 a incompatibilit\u0103\u021bii.<\/p>\n<p>Din cauza aliniamentului, dimensiunea r\u00e2ndului tabelului depinde de ordinea aranj\u0103rii c\u00e2mpurilor. De obicei, acest efect nu este foarte vizibil, dar \u00een unele cazuri poate duce la o cre\u0219tere semnificativ\u0103 a dimensiunii. De exemplu, dac\u0103 amestec\u0103m c\u00e2mpuri de tip char(1) \u0219i integer, \u00eentre ele vor disp\u0103rea, de regul\u0103, 3 bytes inutil.<\/p><\/blockquote>\n<p>\nS\u0103 \u00eencepem cu modelele sintetice:<\/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 bytes\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 bytes<\/code><\/pre>\n<p>\nDe unde au ap\u0103rut c\u00e2teva bytes \u00een plus \u00een primul caz? E simplu \u2014 <b>smallint-ul de 2 bytes se alinieaz\u0103 pe grani\u021ba de 4 bytes<\/b> \u00een fa\u021ba urm\u0103torului c\u00e2mp, iar c\u00e2nd este ultimul \u2014 nu mai este nimic de aliniat \u0219i de ce.<\/p>\n<p>\u00cen teorie \u2014 totul este bine \u0219i putem muta c\u00e2mpurile cum dorim. S\u0103 verific\u0103m cu date reale, folosind un exemplu dintr-unul dintre tabele, a c\u0103rui sec\u021biune zilnic\u0103 ocup\u0103 10-15GB.<\/p>\n<p>Structura ini\u021bial\u0103:<\/p>\n<pre><code class=\"sql\">CREATE TABLE public.plan_20190220\n(\n-- Mo\u0219tenit\u0103 din tabelul plan:  pack uuid NOT NULL,\n-- Mo\u0219tenit\u0103 din tabelul plan:  recno smallint NOT NULL,\n-- Mo\u0219tenit\u0103 din tabelul plan:  host uuid,\n-- Mo\u0219tenit\u0103 din tabelul plan:  ts timestamp with time zone,\n-- Mo\u0219tenit\u0103 din tabelul plan:  exectime numeric(32,3),\n-- Mo\u0219tenit\u0103 din tabelul plan:  duration numeric(32,3),\n-- Mo\u0219tenit\u0103 din tabelul plan:  bufint bigint,\n-- Mo\u0219tenit\u0103 din tabelul plan:  bufmem bigint,\n-- Mo\u0219tenit\u0103 din tabelul plan:  bufdsk bigint,\n-- Mo\u0219tenit\u0103 din tabelul plan:  apn uuid,\n-- Mo\u0219tenit\u0103 din tabelul plan:  ptr uuid,\n-- Mo\u0219tenit\u0103 din tabelul 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>\nSec\u021biunea dup\u0103 schimbarea ordinii coloanelor \u2014 exact <b>acelea\u0219i c\u00e2mpuri, doar ordinea este diferit\u0103<\/b>:<\/p>\n<pre><code class=\"sql\">CREATE TABLE public.plan_20190221\n(\n-- Mo\u0219tenit\u0103 din tabelul plan:  dt date NOT NULL,\n-- Mo\u0219tenit\u0103 din tabelul plan:  ts timestamp with time zone,\n-- Mo\u0219tenit\u0103 din tabelul plan:  pack uuid NOT NULL,\n-- Mo\u0219tenit\u0103 din tabelul plan:  recno smallint NOT NULL,\n-- Mo\u0219tenit\u0103 din tabelul plan:  host uuid,\n-- Mo\u0219tenit\u0103 din tabelul plan:  apn uuid,\n-- Mo\u0219tenit\u0103 din tabelul plan:  ptr uuid,\n-- Mo\u0219tenit\u0103 din tabelul plan:  bufint bigint,\n-- Mo\u0219tenit\u0103 din tabelul plan:  bufmem bigint,\n-- Mo\u0219tenit\u0103 din tabelul plan:  bufdsk bigint,\n-- Mo\u0219tenit\u0103 din tabelul plan:  exectime numeric(32,3),\n-- Mo\u0219tenit\u0103 din tabelul 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>\nVolumul total al sec\u021biunii este determinat de num\u0103rul de \u201efapte\u201d \u0219i depinde doar de procesele externe, prin urmare s\u0103 \u00eemp\u0103r\u021bim dimensiunea heap (<code>pg_relation_size<\/code>) pe num\u0103rul de \u00eenregistr\u0103ri din aceasta \u2014 adic\u0103 vom ob\u021bine <b>dimensiunea medie a \u00eenregistr\u0103rii re\u021binute<\/b>:<\/p>\n<p><img decoding=\"async\" alt=\"Recent, am povestit cum, folosind re\u021bete standard, s\u0103 cre\u0219tem performan\u021ba interog\u0103rilor SQL \u201ela citire\u201d din.\" src=\"\/wp-content\/uploads\/2020\/04\/06be2d7d70d223e7678f9a478e4c293f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<b>Minus 6% din volum<\/b>, excelent!<\/p>\n<p>Dar, desigur, nu totul este at\u00e2t de roz \u2014 deoarece <b>\u00een indici nu putem schimba ordinea c\u00e2mpurilor<\/b>, \u0219i prin urmare \u00ab\u00een general\u00bb (<code>pg_total_relation_size<\/code>)\u2026<\/p>\n<p><img decoding=\"async\" alt=\"Recent, am povestit cum, folosind re\u021bete standard, s\u0103 cre\u0219tem performan\u021ba interog\u0103rilor SQL \u201ela citire\u201d din.\" src=\"\/wp-content\/uploads\/2020\/04\/8beff38e5034fc0d40665b75cb3b3625.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n\u2026 cu siguran\u021b\u0103 \u0219i aici <b>am economisit 1.5%<\/b>, f\u0103r\u0103 a schimba nicio linie de cod. A\u0219a este!<\/p>\n<p><img decoding=\"async\" alt=\"Recent, am povestit cum, folosind re\u021bete standard, s\u0103 cre\u0219tem performan\u021ba interog\u0103rilor SQL \u201ela citire\u201d din.\" src=\"\/wp-content\/uploads\/2020\/04\/10f4a2151465a38bf45823a5d360302b.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>O s\u0103 observ c\u0103 varianta de aranjare a c\u00e2mpurilor de mai sus nu este neap\u0103rat cea mai optim\u0103. Pentru c\u0103 unele blocuri de c\u00e2mpuri nu vrem s\u0103 le \u00abrupt\u00bb din motive estetice \u2014 de exemplu, o pereche <code>(pack, recno)<\/code>, care este PK pentru acest tabel.<\/p>\n<p>\u00cen general, definirea unei aranj\u0103ri \u00abminimale\u00bb a c\u00e2mpurilor este o sarcin\u0103 relativ simpl\u0103 de \u00ab\u00eencercare\u00bb. De aceea, pute\u021bi ob\u021bine rezultate chiar mai bune dec\u00e2t noi cu datele dumneavoastr\u0103 \u2014 \u00eencerca\u021bi!<br \/>\n<br \/>Sursa: <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.2.1 - 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\/ro\/blog\/administrirovanie\/ekonomim-kopeechku-na-bolshih-obemah-v-postgresql\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\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\/ro\/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\udd47Economisim un ban pe volume mari \u00een PostgreSQL | ProHoster","description":"Continu\u00e2nd tema \u00eenregistr\u0103rii fluxurilor mari de date, deschis\u0103 \u00een articolul anterior despre partajare, \u00een acesta vom analiza metodele prin care putem.","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/ekonomim-kopeechku-na-bolshih-obemah-v-postgresql","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"ro_RO","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\/ro\/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\/ro\/wp-json\/wp\/v2\/posts\/79039","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=79039"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/79039\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media\/79040"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=79039"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=79039"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=79039"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}