рдЕрд╢рд╛ рдкрд░рд┐рд╕реНрдерд┐рддреА рдЕрд╕рддрд╛рдд рдЬреЗрд╡реНрд╣рд╛ рдкреНрд░рд╛рдердорд┐рдХ рдХреА рдирд╕рд▓реЗрд▓реНрдпрд╛ рдЯреЗрдмрд▓рдордзреНрдпреЗ рдХрд┐рдВрд╡рд╛ рдЗрддрд░ рдХреЛрдгрддреНрдпрд╛рд╣реА рдЕрджреНрд╡рд┐рддреАрдп рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХрд╛рдд, рдЪреБрдХреАрдореБрд│реЗ, рдЖрдзреАрдЪ рдЕрд╕реНрддрд┐рддреНрд╡рд╛рдд рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдиреЛрдВрджреАрдВрдЪреЗ рд╕рдВрдкреВрд░реНрдг рдХреНрд▓реЛрди рдЕрд╕рддрд╛рдд.

рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдХрд╛рд▓рдХреНрд░рдорд╛рдиреБрд╕рд╛рд░ рдореЗрдЯреНрд░рд┐рдХрдЪреА рдореВрд▓реНрдпреЗ COPY рд╕реНрдЯреНрд░реАрдо рд╡рд╛рдкрд░реВрди PostgreSQL рд╡рд░ рд▓рд┐рд╣рд┐рд▓реА рдЬрд╛рддрд╛рдд рдЖрдгрд┐ рдирдВрддрд░ рдЕрдЪрд╛рдирдХ рдмрд┐рдШрд╛рдб рд╣реЛрддреЛ рдЖрдгрд┐ рдХрд╛рд╣реА рдкреВрд░реНрдгрдкрдгреЗ рдПрдХрд╕рд╛рд░рдЦрд╛ рдбреЗрдЯрд╛ рдкреБрдиреНрд╣рд╛ рдпреЗрддреЛ.
рдбреЗрдЯрд╛рдмреЗрд╕рдордзреВрди рдЕрдирд╛рд╡рд╢реНрдпрдХ рдХреНрд▓реЛрди рдХрд╕реЗ рдХрд╛рдвреВрди рдЯрд╛рдХрд╛рдпрдЪреЗ?
рдЬреЗрд╡реНрд╣рд╛ рдкреАрдХреЗ рдЙрдкрдпреБрдХреНрдд рдирд╕рддреЛ
рд╕рд░реНрд╡рд╛рдд рд╕реЛрдкрд╛ рдЙрдкрд╛рдп рдореНрд╣рдгрдЬреЗ рд╣реА рдкрд░рд┐рд╕реНрдерд┐рддреА рд╕реБрд░реБрд╡рд╛рддреАрд▓рд╛рдЪ рдЙрджреНрднрд╡реВ рдирдпреЗ. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, PRIMARY KEY рд▓рд╛рдЧреВ рдХрд░реВрди. рдкрд░рдВрддреБ рд╕рд╛рдард╡рд▓реЗрд▓реНрдпрд╛ рдбреЗрдЯрд╛рдЪреЗ рдкреНрд░рдорд╛рдг рд╡рд╛рдврд╡рд▓реНрдпрд╛рд╢рд┐рд╡рд╛рдп рд╣реЗ рдиреЗрд╣рдореАрдЪ рд╢рдХреНрдп рдирд╕рддреЗ.
рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдЬрд░ рд╕реНрддреНрд░реЛрдд рдкреНрд░рдгрд╛рд▓реАрдЪреА рдЕрдЪреВрдХрддрд╛ рдбреЗрдЯрд╛рдмреЗрд╕рдордзреАрд▓ рдлреАрд▓реНрдбрдЪреНрдпрд╛ рдЕрдЪреВрдХрддреЗрдкреЗрдХреНрд╖рд╛ рдЬрд╛рд╕реНрдд рдЕрд╕реЗрд▓ рддрд░:
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}
рд▓рдХреНрд╖рд╛рдд рдЖрд▓реЗ рдХрд╛? 00:00:02 рдРрд╡рдЬреА, рдХрд╛рдЙрдВрдЯрдбрд╛рдЙрди рдПрдХрд╛ рд╕реЗрдХрдВрджрд╛рдкреВрд░реНрд╡реА ts рдбреЗрдЯрд╛рдмреЗрд╕рдордзреНрдпреЗ рд░реЗрдХреЙрд░реНрдб рдХреЗрд▓реЗ рдЧреЗрд▓реЗ рд╣реЛрддреЗ, рдкрд░рдВрддреБ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдирд╛рддреВрди рддреЗ рдкреВрд░реНрдгрдкрдгреЗ рд╡реИрдз рд░рд╛рд╣рд┐рд▓реЗ (рд╢реЗрд╡рдЯреА, рдбреЗрдЯрд╛ рдореВрд▓реНрдпреЗ рднрд┐рдиреНрди рдЖрд╣реЗрдд!).
рдЕрд░реНрдерд╛рдд, рддреЗ рдХрд░рддрд╛ рдпреЗрддреЗ рдкреАрдХреЗ(рдореЗрдЯреНрд░рд┐рдХ, рдЯреАрдПрд╕) тАФ рдкрдг рдирдВрддрд░ рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рд╡реИрдз рдбреЗрдЯрд╛рд╕рд╛рдареА рдЗрдиреНрд╕рд░реНрд╢рди рд╕рдВрдШрд░реНрд╖ рдорд┐рд│рддреАрд▓.
рдХрд░реВ рд╢рдХрддреЛ рдкреАрдХреЗ(рдореЗрдЯреНрд░рд┐рдХ, рдЯреАрдПрд╕, рдбреЗрдЯрд╛) - рдкрдг рдпрд╛рдореБрд│реЗ рддреНрдпрд╛рдЪреЗ рдкреНрд░рдорд╛рдг рдЦреВрдк рд╡рд╛рдвреЗрд▓, рдЬреЗ рдЖрдкрдг рд╡рд╛рдкрд░рдгрд╛рд░ рдирд╛рд╣реА.
рдореНрд╣рдгреВрди, рд╕рд░реНрд╡рд╛рдд рдпреЛрдЧреНрдп рдкрд░реНрдпрд╛рдп рдореНрд╣рдгрдЬреЗ рдирд┐рдпрдорд┐рдд рдиреЙрди-рдпреБрдирд┐рдХ рдЗрдВрдбреЗрдХреНрд╕ рддрдпрд╛рд░ рдХрд░рдгреЗ. (рдореЗрдЯреНрд░рд┐рдХ, рдЯреАрдПрд╕) рдЖрдгрд┐ рдЬрд░ рд╕рдорд╕реНрдпрд╛ рдЙрджреНрднрд╡рд▓реНрдпрд╛ рддрд░ рддреНрдпрд╛ рд╕реЛрдбрд╡рд╛.
рдХреНрд▓реЛрди рдпреБрджреНрдзреЗ рд╕реБрд░реВ рдЭрд╛рд▓реА рдЖрд╣реЗрдд.
рдХрд╛рд╣реА рдкреНрд░рдХрд╛рд░рдЪрд╛ рдЕрдкрдШрд╛рдд рдЭрд╛рд▓рд╛, рдЖрдгрд┐ рдЖрддрд╛ рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдЯреЗрдмрд▓рд╡рд░реАрд▓ рдХреНрд▓реЛрди рд░реЗрдХреЙрд░реНрдб рдирд╖реНрдЯ рдХрд░рд╛рд╡реЗ рд▓рд╛рдЧрддреАрд▓.

рдЪрд▓рд╛ рд╕реБрд░реБрд╡рд╛рддреАрдЪреНрдпрд╛ рдбреЗрдЯрд╛рдЪреЗ рдЕрдиреБрдХрд░рдг рдХрд░реВрдпрд╛:
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)
;рдЗрдереЗ рдЖрдкрд▓рд╛ рд╣рд╛рдд рддреАрди рд╡реЗрд│рд╛ рд╣рд▓рд▓рд╛, Ctrl+V рдЕрдбрдХрд▓реЗ, рдЖрдгрд┐ рд╣реЗ рдмрдШрд╛...
рдкреНрд░рдердо, рдЖрдкрдг рд╣реЗ рд╕рдордЬреВрди рдШреЗрдКрдпрд╛ рдХреА рдЖрдкрд▓реЗ рдЯреЗрдмрд▓ рдмрд░реЗрдЪ рдореЛрдареЗ рдЕрд╕реВ рд╢рдХрддреЗ, рдореНрд╣рдгреВрди рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рд╕рд░реНрд╡ рдХреНрд▓реЛрди рд╕рд╛рдкрдбрд▓реНрдпрд╛рдирдВрддрд░, рддреЗ рд╣рдЯрд╡рд┐рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдЕрдХреНрд╖рд░рд╢рдГ "рдмреЛрдЯ рд▓рд╛рд╡рд╛рд╡реЗ рд▓рд╛рдЧреЗрд▓". рд╡рд┐рд╢рд┐рд╖реНрдЯ рдиреЛрдВрджреА рдкреБрдиреНрд╣рд╛ рди рд╢реЛрдзрддрд╛.
рдЖрдгрд┐ рдЕрд╕рд╛ рдПрдХ рдорд╛рд░реНрдЧ рдЖрд╣реЗ - рд╣рд╛ рдЖрд╣реЗ , рд╡рд┐рд╢рд┐рд╖реНрдЯ рд░реЗрдХреЙрд░реНрдбрдЪрд╛ рднреМрддрд┐рдХ рдУрд│рдЦрдХрд░реНрддрд╛.
рддрд░, рд╕рд░реНрд╡рдкреНрд░рдердо, рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдЯреЗрдмрд▓рдЪреНрдпрд╛ рдкрдВрдХреНрддреАрдЪреНрдпрд╛ рд╕рдВрдкреВрд░реНрдг рдордЬрдХреБрд░рд╛рд╡рд░ рдЖрдзрд╛рд░рд┐рдд рд░реЗрдХреЙрд░реНрдбрдЪреЗ CTID рдЧреЛрд│рд╛ рдХрд░рд╛рд╡реЗ рд▓рд╛рдЧрддреАрд▓. рд╕рд░реНрд╡рд╛рдд рд╕реЛрдкрд╛ рдкрд░реНрдпрд╛рдп рдореНрд╣рдгрдЬреЗ рд╕рдВрдкреВрд░реНрдг рдкрдВрдХреНрддреА рдордЬрдХреВрд░рд╛рдд рдХрд╛рд╕реНрдЯ рдХрд░рдгреЗ:
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)"}
рдХрд╛рд╕реНрдЯ рди рдХрд░рдгреЗ рд╢рдХреНрдп рдЖрд╣реЗ рдХрд╛?рддрддреНрд╡рддрдГ, рдмрд╣реБрддреЗрдХ рдкреНрд░рдХрд░рдгрд╛рдВрдордзреНрдпреЗ рд╣реЗ рд╢рдХреНрдп рдЖрд╣реЗ. рдЬреЛрдкрд░реНрдпрдВрдд рддреБрдореНрд╣реА рдпрд╛ рдЯреЗрдмрд▓рдордзреАрд▓ рдлреАрд▓реНрдб рд╡рд╛рдкрд░рдгреНрдпрд╛рд╕ рд╕реБрд░реБрд╡рд╛рдд рдХрд░рдд рдирд╛рд╣реА рддреЛрдкрд░реНрдпрдВрдд рд╕рдорд╛рдирддрд╛ рдирд╕рд▓реЗрд▓реЗ рдСрдкрд░реЗрдЯрд░ рдкреНрд░рдХрд╛рд░:
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
рдЕрд╣рд╛рд╣рд╛, рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рд▓рдЧреЗрдЪ рджрд┐рд╕реВрди рдпреЗрддреЗ рдХреА рдЬрд░ рдЕтАНреЕрд░реЗрдордзреНрдпреЗ рдПрдХрд╛рдкреЗрдХреНрд╖рд╛ рдЬрд╛рд╕реНрдд рдПрдВрдЯреНрд░реА рдЕрд╕рддреАрд▓ рддрд░ рддреЗ рд╕рд░реНрд╡ рдХреНрд▓реЛрди рдЖрд╣реЗрдд. рдЪрд▓рд╛ рдлрдХреНрдд рддреЗрдЪ рдареЗрд╡реВрдпрд╛:
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)рдЬреНрдпрд╛рдВрдирд╛ рд▓рд╣рд╛рди рд▓рд┐рд╣рд╛рдпрд▓рд╛ рдЖрд╡рдбрддреЗ рддреНрдпрд╛рдВрдЪреНрдпрд╛рд╕рд╛рдареАрддреБрдореНрд╣реА рддреЗ рдЕрд╕реЗ рджреЗрдЦреАрд▓ рд▓рд┐рд╣реВ рд╢рдХрддрд╛:
SELECT
unnest((array_agg(ctid))[2:])
FROM
tbl T
GROUP BY
T::text;рдЖрдореНрд╣рд╛рд▓рд╛ рд╕рд┐рд░реАрдпрд▓рд╛рдЗрдЬреНрдб рд╕реНрдЯреНрд░рд┐рдВрдЧрдЪреНрдпрд╛ рд╡реНрд╣реЕрд▓реНрдпреВрдордзреНрдпреЗ рд░рд╕ рдирд╕рд▓реНрдпрд╛рдореБрд│реЗ, рдЖрдореНрд╣реА рддреЗ рд╕рдмрдХреНрд╡реЗрд░реАрдЪреНрдпрд╛ рдкрд░рдд рдЖрд▓реЗрд▓реНрдпрд╛ рдХреЙрд▓рдордордзреВрди рд╡рдЧрд│рд▓реЗ.
рдЖрдореНрд╣рд╛рд▓рд╛ рдорд┐рд│рд╛рд▓реЗрд▓реНрдпрд╛ рд╕рдВрдЪрд╛рдЪрд╛ рд╡рд╛рдкрд░ DELETE рд▓рд╛ рдХрд░рд╛рдпрд▓рд╛ рд▓рд╛рд╡рдгреЗ рдПрд╡рдвреЗрдЪ рдЙрд░рд▓реЗ рдЖрд╣реЗ:
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[]);рдЪрд▓рд╛ рд╕реНрд╡рддрдГрдЪреА рддрдкрд╛рд╕рдгреА рдХрд░реВрдпрд╛:

рд╣реЛ, рдмрд░реЛрдмрд░ рдЖрд╣реЗ: рдЖрдордЪреЗ рей рд░реЗрдХреЙрд░реНрдб рд╕рдВрдкреВрд░реНрдг рдЯреЗрдмрд▓рдЪреНрдпрд╛ рдПрдХрд╛рдЪ Seq рд╕реНрдХреЕрдирдордзреНрдпреЗ рдирд┐рд╡рдбрд▓реЗ рдЧреЗрд▓реЗ рд╣реЛрддреЗ рдЖрдгрд┐ рдбреЗрдЯрд╛ рд╢реЛрдзрдгреНрдпрд╛рд╕рд╛рдареА Delete рдиреЛрдб рд╡рд╛рдкрд░рд▓рд╛ рдЧреЗрд▓рд╛ рд╣реЛрддрд╛. рдЯрд┐рдб рд╕реНрдХреЕрдирд╕рд╣ рд╕рд┐рдВрдЧрд▓ рдкрд╛рд╕:
-> Tid Scan on tbl (actual time=0.050..0.051 rows=3 loops=1)
TID Cond: (ctid = ANY ($0))рдЬрд░ рддреБрдореНрд╣реА рдмрд░реЗрдЪ рд░реЗрдХреЙрд░реНрдб рд╕рд╛рдл рдХреЗрд▓реЗ рддрд░, .
рдЪрд▓рд╛ рдореЛрдареНрдпрд╛ рдЯреЗрдмрд▓рд╕рд╛рдареА рдЖрдгрд┐ рдЬрд╛рд╕реНрдд рдбреБрдкреНрд▓рд┐рдХреЗрдЯрд╕рд╣ рддрдкрд╛рд╕реВрдпрд╛:
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; 
рдореНрд╣рдгреВрди, рд╣реА рдкрджреНрдзрдд рдпрд╢рд╕реНрд╡реАрд░рд┐рддреНрдпрд╛ рдХрд╛рд░реНрдп рдХрд░рддреЗ, рдкрд░рдВрддреБ рддреА рдХрд╛рд╣реА рд╕рд╛рд╡рдзрдЧрд┐рд░реАрдиреЗ рд╡рд╛рдкрд░рд▓реА рдкрд╛рд╣рд┐рдЬреЗ. рдХрд╛рд░рдг рдкреНрд░рддреНрдпреЗрдХ рдбрд┐рд▓реАрдЯ рдХреЗрд▓реЗрд▓реНрдпрд╛ рд░реЗрдХреЙрд░реНрдбрд╕рд╛рдареА, рдЯрд┐рдб рд╕реНрдХреЕрдирдордзреНрдпреЗ рдПрдХ рдбреЗрдЯрд╛ рдкреЗрдЬ рд╡рд╛рдЪрд▓рд╛ рдЬрд╛рддреЛ рдЖрдгрд┐ рдбрд┐рд▓реАрдЯрдордзреНрдпреЗ рдПрдХ.
рд╕реНрддреНрд░реЛрдд: www.habr.com
