Te whakawātea i nga rekoata kawa mai i te teepu kaore he PK

He waahi ka ki te ripanga kahore he kī matua i etahi atu taurangi ahurei ranei, na te pohehe, kua whakauruhia nga kohinga katoa o nga rekoata o mua.

Te whakawātea i nga rekoata kawa mai i te teepu kaore he PK

Hei tauira, ka tuhia nga uara o te inenga o te waa ki te PostgreSQL ma te whakamahi i te awa COPY, katahi ka rahua ohorere, ka tae mai ano tetahi waahanga o nga raraunga tino rite.

Me pehea te whakakore i te papaaarangi o nga iramahe kore?

Ina ehara a PK i te kaiawhina

Ko te huarahi tino ngawari ko te aukati i nga ahuatanga penei i te tuatahi. Hei tauira, hurihia KEY TUATAHI. Engari kaore tenei e taea i nga wa katoa me te kore e whakanui ake i te rahi o nga raraunga rongoa.

Hei tauira, ki te mea he teitei ake te tika o te punaha puna i te tika o te mara i roto i te putunga:

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}

I kite koe? The countdown instead of 00:00:02 i tuhia i roto i te paataka raraunga me te ts i te tuarua o mua, engari i noho tika tonu mai i te tirohanga tono (i muri i nga mea katoa, he rereke nga uara raraunga!).

Ko te akoranga ka taea e koe PK(mehua, ts) - engari ka whiwhi tatou i nga tautohetohe whakauru mo nga raraunga whaimana.

Ka taea PK(ira, ts, raraunga) - engari ka nui ake te rahi o te rahi, kaore e whakamahia e matou.

Na reira, ko te whiringa tino tika ko te hanga i te taurangi ahurei kore (ira, ts) me te whakatau i nga raruraru i muri i te meka mehemea ka ara ake.

"Kua timata te pakanga clonic"

I pa mai etahi aitua, a inaianei me whakangaro e matou nga rekoata kiore mai i te teepu.

Te whakawātea i nga rekoata kawa mai i te teepu kaore he PK

Kia whakatauira tatou i nga raraunga taketake:

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)
;

I konei ka toru nga wiri o to matou ringa, ka mau te Ctrl+V, inaianei...

Tuatahi, kia mohio tatou he nui rawa to tatou teepu, no reira ka kitea e tatou nga kiore katoa, he mea tika kia "poke to tatou maihao" ki te muku. rekoata motuhake me te kore e rapu ano.

Na tera ano tetahi huarahi - ko tenei korero na ctid, te tautohu tinana o tetahi rekoata motuhake.

Arā, i te tuatahi, me kohia e tatou te ctid o nga rekoata i roto i te horopaki o nga korero katoa o te rarangi ripanga. Ko te kōwhiringa māmā ko te maka i te rārangi katoa ki te kuputuhi:

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)"}

Ka taea te kore e maka?Ko te tikanga, ka taea i te nuinga o nga wa. Kia timata ra ano koe ki te whakamahi i nga mara o tenei ripanga momo karekau he kaiwhakahaere taurite:

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

Ae, ka kite tonu tatou mena ka nui ake i te kotahi te urunga ki roto i te rarangi, he kiore katoa enei. Me waiho noa ratou:

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)

Mo te hunga e pai ana ki te tuhi poto akeKa taea hoki e koe te tuhi penei:

SELECT
  unnest((array_agg(ctid))[2:])
FROM
  tbl T
GROUP BY
  T::text;

I te mea ko te uara o te aho rangatū ake ehara i te mea whakamere ki a matou, ka peia noa e matou ki waho o nga pou kua whakahokia mai o te patai.

He iti noa te mahi e toe ana - me whakamahi a DELETE i te huinga kua riro mai:

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[]);

Kia tirohia e tatou ano:

Te whakawātea i nga rekoata kawa mai i te teepu kaore he PK
[Tirohia i te explain.tensor.ru]

Ae, he tika nga mea katoa: ko o maatau rekoata e 3 i tohua mo te Seq Scan anake o te ripanga katoa, a ka whakamahia te kopuku Muku ki te rapu raraunga haere kotahi me Tid Scan:

->  Tid Scan on tbl (actual time=0.050..0.051 rows=3 loops=1)
      TID Cond: (ctid = ANY ($0))

Mena kua whakakorehia e koe te maha o nga rekoata, kaua e wareware ki te whakahaere VACUUM ANALYZE.

Kia tirohia he ripanga nui ake me te maha o nga taarua:

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;

Te whakawātea i nga rekoata kawa mai i te teepu kaore he PK
[Tirohia i te explain.tensor.ru]

Na, he pai te mahi o te tikanga, engari me whakamahi ma te tupato. Na te mea mo ia rekoata ka mukua, kotahi te wharangi raraunga e panuitia ana i Tid Scan, kotahi i Muku.

Source: will.com

Tāpiri i te kōrero