Sunt condiciones cum ad mensam sine prima clavem vel alius quidam index singularis, ob inspectionem, clones integrae monumentorum iam exsistentium comprehenduntur.
Exempli gratia, valores metrici chronologici in PostgreSQL usus exemplaris amnis scriptae sunt, et tunc subito defectus est, et pars prorsus eadem notitia iterum advenit.
Quomodo datorum supervacuorum clonum exuere?
Cum PK non est adiutor
Facillima via est, quominus in primis talis condicio fiat. Exempli gratia: VOLUMEN PRIMA CLAVIS. Sed hoc non semper fieri potest sine data copia aucto volumine.
Exempli gratia, si subtilitas principii est altior quam subtilitas agri in datorum;
metric | ts | data
--------------------------------------------------
cpu.busy | 2019-12-20 00:00:00 | {"value" : 12.34}
cpu.busy | 2019-12-20 00:00:01 | {"value" : 10}
cpu.busy | 2019-12-20 00:00:01 | {"value" : 11.2}
cpu.busy | 2019-12-20 00:00:03 | {"value" : 15.7}
Vidistin'? In countdown instead of 00:00:02 scripta sunt in database cum ts secundo antecedente, sed satis valida permansit ab applicatione rationis (postquam diversae sunt notae valores!).
Scilicet potes facere PK (metricus, ty) - sed tunc certamina pro valida notitia habebimus.
potestis facere PK (metrica, ty, data); β sed hoc volumen suum magnopere augebit, quo non utemur.
Optionem ergo rectissimam facere est index ordinarius non-unicus (metric, ty) et negotia post facto si oriantur.
" Bellum clonicum incepit " ;
Fortuitum aliquod accidit, et nunc tabulas clone e convivio solvere debemus.
Sit scriptor originale data exemplar:
CREATE TABLE tbl(k text, v integer);
INSERT INTO tbl
VALUES
('a', 1)
, ('a', 3)
, ('b', 2)
, ('b', 2) -- oops!
, ('c', 3)
, ('c', 3) -- oops!!
, ('c', 3) -- oops!!
, ('d', 4)
, ('e', 5)
;
Hic tremuit manus nostra ter, Ctrl+V haesit, et nunc...
Primum, intelligamus mensam nostram posse praegrandem esse, ergo postquam omnes clones invenimus, expedit nobis ad litteram "digitum nostrum" delere. certis monumentis non re-investigatione.
Et est modus iste
Hoc est, ante omnia, opus est ut res gestas in contextu totius tabulae ordine colligamus. Optio simplicissima est totam lineam in textum rejicere:
SELECT
T::text
, array_agg(ctid) ctids
FROM
tbl T
GROUP BY
1;
t | ctids
---------------------------------
(e,5) | {"(0,9)"}
(d,4) | {"(0,8)"}
(c,3) | {"(0,5)","(0,6)","(0,7)"}
(b,2) | {"(0,3)","(0,4)"}
(a,3) | {"(0,2)"}
(a,1) | {"(0,1)"}
Numquid non ejicere possumus?In principio, possibile est in pluribus. Donec utens agris in hac mensa types sine aequalitatem operator:
CREATE TABLE tbl(k text, v integer, x point);
SELECT
array_agg(ctid) ctids
FROM
tbl T
GROUP BY
T;
-- ERROR: could not identify an equality operator for type tbl
Yeah, statim videmus quod si plures introitus in agmine sunt omnes clones. Abeamus eos modo:
SELECT
unnest(ctids[2:])
FROM
(
SELECT
array_agg(ctid) ctids
FROM
tbl T
GROUP BY
T::text
) T;
unnest
------
(0,6)
(0,7)
(0,4)
Nam qui libet scribere brevioraScribere etiam potes sic;
SELECT
unnest((array_agg(ctid))[2:])
FROM
tbl T
GROUP BY
T::text;
Cum valor ipsius chordae serialised nos non commodat, simpliciter e columnis subqueryis redditis proiecimus.
Illic 'modicum relictum est facere β delere fac utamur statuto quod accepimus;
DELETE FROM
tbl
WHERE
ctid = ANY(ARRAY(
SELECT
unnest(ctids[2:])
FROM
(
SELECT
array_agg(ctid) ctids
FROM
tbl T
GROUP BY
T::text
) T
)::tid[]);
Nosmet ipsos reprimamus;
Recte omnia: nostri 3 annales delecti sunt solum Seq Scan totius tabulae, et nodi Deleti ad notitias quaerendas adhibita. una saltum Tid Scan:
-> Tid Scan on tbl (actual time=0.050..0.051 rows=3 loops=1)
TID Cond: (ctid = ANY ($0))
Si multum repurgata monumenta;
In tabula maiore perscribemus et cum pluribus duplicatis:
TRUNCATE TABLE tbl;
INSERT INTO tbl
SELECT
chr(ascii('a'::text) + (random() * 26)::integer) k -- a..z
, (random() * 100)::integer v -- 0..99
FROM
generate_series(1, 10000) i;
Modus igitur feliciter operatur, sed caute utendum est. Quia ad omne testimonium quod deletum est, una notitia pagina in Tid Scan legitur, et una in Deleta.
Source: www.habr.com