Clone derelinquens records a mensa sine PK *

Sunt condiciones cum ad mensam sine prima clavem vel alius quidam index singularis, ob inspectionem, clones integrae monumentorum iam exsistentium comprehenduntur.

Clone derelinquens records a mensa sine PK *

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.

Clone derelinquens records a mensa sine PK *

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 alloquens ctidphysicum identifier cuiusdam rei gestae.

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;

Clone derelinquens records a mensa sine PK *
[Aspice explain.tensor.ru]

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; Vacuum ANALYZE currere noli oblivisci.

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;

Clone derelinquens records a mensa sine PK *
[Aspice explain.tensor.ru]

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