Salvum denarium in magnis voluminibus in PostgreSQL

Argumentum ad memoriam magna notitia rivi evecti priorem articulum de partitionibusin hoc videbimus modos quibus potes reducere "corporis" magnitudinem stored " in PostgreSQL, eorumque immutationem in servo perficiendi.

Nos loqui tibi PRAEBIBO occasus ac data alignment. "In mediocris" hae methodi nimis multas facultates non servabunt, sed sine ulla applicationis codicem omnino servabunt.

Salvum denarium in magnis voluminibus in PostgreSQL
Attamen experientia nostra hac in re plurimum fructuosa evasit, cum adipiscing paene cuiuslibet naturae ipsius vigilantia sit maxime append-tantum secundum memoriae data. Et si miraris quomodo docere possis datorum scribere pro orbe 200MB / s dimidium tantum — obsecro sub cat.

Parva arcana magna data

Per profile officium nostrum servitiumad eum e cubilibus advolant text packages.

Et quoniam VLSI complexucuius database nos monitores multi-component productum est cum structurarum multiplicium notitiarum, tum queries ad maximum perficientur satis evenire sic "Multi-volumen" cum logica algorithmica complexu. Singulae igitur instantiae petitionis vel consequentis exsecutionis consilium in tomo quod nobis evenit, evenit ut "in mediocris" satis magnum sit.

Inspiciamus structuram unius tabularum, in quam notitias "rudis" scribimus, hoc est, hic est textus originalis e ingressu iniuriarum:

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

Signum typicum (iam sectioned, sane, sic haec est pars template), ubi potissima res est textus. Interdum satis frequens est.

Recordare "physicam" magnitudinem unius rei in PG non plus quam unam paginam notitiarum occupare, sed magnitudinem "logicam" materiam omnino esse diversam. Scribere valorem volumetric (varchar/text/bytea) ad agrum, usum PRAEBIBO technology:

PostgreSQL certa pagina magnitudine utitur (typice 8 KB), nec permittit tuples plures paginas spatiari. Impossibile est ergo immensum agrum bene condere valores amplissimos. Ad hanc limitationem superandam, magni campi valores comprimuntur et/vel per plures lineas physicas scinduntur. Hoc lateat ab usuario et parum momenti in codice maxime servo habet. Haec methodus notissima est ut TOAST...

Re vera, pro qualibet mensa cum agris "potentialibus", automatice paribus mensam cum "slicing" creatum est uterque "magnus" recordum in segmentis 2KB:

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

Hoc est, si filo scribere debebimus cum valore "magni" data, tunc realis memoria occurret non solum ad mensam principalem eiusque PK, sed etiam ad TOAST eiusque PKq.

Redigo auctoritas PRAEBIBO

Plerique autem nostri monumenta adhuc non magna sunt; oportet in 8KB * - Quomodo pecuniam in hoc servare possum?..

Haec ubi attributum nobis auxilium venit STORAGE ad mensam columnae;

  • PRODUCTUS permittit et compressionem et separatam repono. Hoc vexillum optio plurimae TORRO data genera obsecundantia. Primum compressionem efficere conatur, deinde extra mensam reponit si ordo nimis magnus est.
  • SED CONTRA permittit compressionem sed non separatum repono. Reapse separatum adhuc pro talibus columnis conficietur, sed tantum in novissima spe, cum nulla alia via ad nervum abhorreat ut in paginae quadret).

Reapse, haec prorsus sunt quae in textu desiderantur. quam maxime comprime, et si omnino non apta, pone in TOAST. Id fieri potest protinus in musca, uno praecepto;

ALTER TABLE rawdata_orig ALTER COLUMN data SET STORAGE MAIN;

Quomodo aestimare effectum

Cum data fluunt cotidie mutabilia, non possumus comparare numeros absolutos, sed in terminis relativis minor Scripsimus in TOAST — tanto melius. Sed hic periculum est, quo maius volumen "physicum" uniuscuiusque recordationis est, "latior" index fit, quia plures paginas notitiarum operire debemus.

sectioni ante mutationes:

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

sectioni post mutationes:

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

In facto, coepi scribere PRAEBIBO II tempora, minus saepequae non solum orbis, sed etiam CPU exonerabat;

Salvum denarium in magnis voluminibus in PostgreSQL
Salvum denarium in magnis voluminibus in PostgreSQL
Notabimus etiam nos in orbe "legere" etiam minores fieri, non solum "scribere" - quoniam, cum in tabulas recordum inserentes, etiam partem ligni uniuscuiusque indicis debemus habere ad definiendum. futuram in eis opinionem.

Quis bene vivere potest in PostgreSQL 11

Postquam ad PG11 adaequationem, "tuning" TOAST pergere decrevimus et animadverterunt parametrum ab hac versione proficisci in promptum ad tuning toast_tuple_target:

TOAST codicem processus tantum ignes, cum ordo pretii in mensa reponendus est, maior est bytes quam TOAST_TUPLE_THRESHOLD (plerumque 2 KB). Codex TOAST comprimet et/vel agrum e mensa valores movebit donec ordo pretii minor fiat quam bytes TOAST_TUPLE_TARGET (valor variabilis, etiam plerumque 2 KB) vel magnitudo minui non potest.

Nos datam quam plerumque habere decrevimus vel "brevissimam" vel "longissimam" esse decrevimus, ita nos decrevimus ut minimi valoris possibilis nos circumscriberetur;

ALTER TABLE rawplan_orig SET (toast_tuple_target = 128);

Videamus quomodo novae uncinis affectatae orbis loading post reconfigurationem:

Salvum denarium in magnis voluminibus in PostgreSQL
Non malus! Mediocris queue in disco decrevit circiter 1.5 temporibus, et orbis "occupatus" est 20 percent! Sed fortasse hoc CPU affectavit?

Salvum denarium in magnis voluminibus in PostgreSQL
Peius certe non pervenit. Quamquam, difficile est iudicare si etiam haec volumina mediocris CPU onere altiora movere non possunt 5%.

Mutando locos terminorum, summam... mutationes!

Ut scis, denarium rublum servat, et cum voluminibus nostris reposita est circa 10TB / mensis etiam parva ipsum bonum lucrum dare potest. Propterea operam dabamus ad structuram physicam notitiae nostrae - quam exacte "Reclinant" recordum intra agros singulis tabulis.

Quia propter data alignment hoc rectum accidit inde volumine:

Multae architecturae notitias noctis in machina verbi limitibus praebent. Exempli gratia, in systematis 32-x86 bis, integri (integrum genus, 4 bytes) in 4-byte verbi circumscriptione perpendentur, ut numeri punctum fluitantis duplices praecise (duplex praecisio punctum fluitans, 8 bytes). Et in 64-bit ratio, valores duplices ad 8-byte verbi terminationes perpendentur. Haec est alia ratio repugnantiae.

Ob noctis magnitudinem tabulae ordo agrorum ex ordine dependet. Plerumque hic effectus non multum notabilis est, sed in aliquibus casibus potest ad notabilem augmentum augeri. Exempli gratia, si char(1) et agros integros misceas, typice 3 bytes inter eos vastabuntur.

Sit scriptor synthetica exempla incipere:

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

Ubi duo extra bytes ex in primo casu veniunt? Simplex est - II-byte smallint varius in IV-byte terminus ante proximum agrum, et cum est ultimum, nihil est nec opus madidum.

In speculativis, omnia praeclara sunt, et ut voles agros disponere potes. Reprehendamus in reali notitia utendo exemplo unius tabularum, quarum sectionem quotidianam occupat 10-15GB.

Structura initialis:

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)

Sectio mutato ordine columnae - exacte eisdem agris, sicut alium ordinem:

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)

Totum volumen sectionis numero "factarum" determinatur et solum in processibus externis pendet, ut magnitudinem acervi dividamus (pg_relation_size) per numerum in eo historiarum, id est, obtinemus Mediocris magnitudinem ipsam stored record:

Salvum denarium in magnis voluminibus in PostgreSQL
Minus 6% volumen, Magna!

Sed omnia quidem non ita rosea sunt. in indices ordinem agri mutare non possumuset ideo generaliter.pg_total_relation_size) ...

Salvum denarium in magnis voluminibus in PostgreSQL
... etiam hic salvus 1.5%non mutato uno codice. Etiam Etiam!

Salvum denarium in magnis voluminibus in PostgreSQL

Adnoto, optionem praedictam agrorum disponendi non esse optimam. Quia non vis "divellere" aliquos cuneos agrorum ob causas aestheticas - exempli gratia duo (pack, recno)quod est PK huic tabulae.

In genere, "minimum" agrorum ordinatio determinans munus "virum violentum" satis simplex est. Ergo melius evenire potes ex notitia tua quam nostra - illud experire!

Source: www.habr.com

Add a comment