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.
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.
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
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:
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,
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;
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