Argumentum ad memoriam magna notitia rivi evecti
Nos loqui tibi PRAEBIBO occasus ac data alignment. "In mediocris" hae methodi nimis multas facultates non servabunt, sed sine ulla applicationis codicem omnino servabunt.
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
Et quoniam
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
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
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
- 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;
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:
Non malus! Mediocris queue in disco decrevit circiter 1.5 temporibus, et orbis "occupatus" est 20 percent! Sed fortasse hoc CPU affectavit?
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
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:
Minus 6% volumen, Magna!
Sed omnia quidem non ita rosea sunt. in indices ordinem agri mutare non possumuset ideo generaliter.pg_total_relation_size
) ...
... etiam hic salvus 1.5%non mutato uno codice. Etiam Etiam!
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