áá¯ááºáá²á·á¡ááŒá±á¡áá±ááœá±ááŸááááºá áááºááá±á¬á·ááá«áá±á¬ á á¬ážááœá²áá®ááá¯á· ááá¯á·ááá¯áẠááŒá®ážááŒááºááŸá¯áá áºáá¯ááŒá±á¬áá·áºá ááŸáááŒá®ážáá¬áž ááŸááºáááºážáá»á¬áž á¡ááŒáá·áºá¡á á¯á¶áá«áááºáá«áááºá
á¥ááá¬á¡á¬ážááŒáá·áºá á¡áá»áááºááŸáá·áºáááŒá±ážáá®áááºááá
áºáá
áºáá¯ááááºááá¯ážáá»á¬ážááᯠCOPY stream ááá¯á¡áá¯á¶ážááŒá¯áᬠPostgreSQL ááœááºáá±ážááŸááºááŒá®áž áá¯ááºáááẠáá»ááºááœááºááœá¬ážáᬠáá¯á¶ážááááºáá°áá»áá±á¬áá±áá¬ááá
áºá
áááºáá
áºááá¯ááºáž áááºáá¶áá±á¬ááºááŸááá¬áá«áááºá
áááá¯á¡ááºáá±á¬ clone áá»á¬ážááá±áá¬áá±á·á
ááá¯áááºááá¯á·áááºááŸá¬ážáááºáááºážá
PK á á¡áá±á¬ááºá¡á ááá¯ááºáá°ážá
á¡ááœááºáá¯á¶ážáááºážáááºážááá±á¬á· áá®ááá¯á¡ááŒá±á¡áá±áá»áá¯áž áááŒá áºá¡á±á¬áẠááŒáá¯áááºáá¬ááœááºááá¯á·áá«áá²á á¥ááá¬á 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}
ááááá¬ážáááá¬áž? The countdown á¡á á¬áž 00:00:02 á¡á á±á¬ááá¯ááºážááœáẠts ááŒáá·áº áá±áá¬áá±á·á áºááœáẠááŸááºáááºážáááºáá²á·áááºá ááá¯á·áá±á¬áº á¡ááá®áá±ážááŸááºážá¡ááŒááºá០á¡áá±á¬áºáá±áž ááá¯ááºáá¯á¶áá±áá±ááẠ(á¡á¬ážáá¯á¶ážááŒá®ážáá±á¬ááºá áá±áá¬áááºááá¯ážáá»á¬ážááẠááœá²ááŒá¬ážáááº!)á
áá¯ááºááá¯ááºáá¬áá±á«á·á PK(áááºááá áºá ts) - ááá¯á·áá±á¬áº ááŸááºáááºáá±á¬áá±áá¬á¡ááœáẠááá·áºááœááºážááŸá¯áááááá¹ááá»á¬ážááᯠáá»áœááºá¯ááºááá¯á·áááŸááá«áááºá
ááá»ááá»áá¯áá»ááá¯áá» PK(áááºááá áºá tsá áá±áá¬) - ááá¯á·áá±á¬áº áááºážááẠáá»áœááºá¯ááºááá¯á·á¡áá¯á¶ážáááŒá¯ááá·áº áááºážáá¡áá¶á¡ááá¯ážá¡áá»ááºááᯠá¡ááœááºááá¯ážá á±áááºááŒá áºáááºá
ááá¯á·ááŒá±á¬áá·áºá á¡ááŸááºáááºáá¯á¶ážááœá±ážáá»ááºááŸá¯ááẠáá¯á¶ááŸááºááá¯ááºáá±á¬ á¡ááœáŸááºážááááºážáá áºáᯠááŒá¯áá¯ááºáááºááŒá áºáááºá (áááºááá áºá 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
áá¯ááºáá²á·á array ááœáẠáá áºáá¯áááºááá¯áá±á¬ entry ááŸááá«áá áááºážááá¯á·á¡á¬ážáá¯á¶ážááẠclones áá»á¬ážááŒá áºááŒá±á¬ááºáž áá»áœááºá¯ááºááá¯á·áá»ááºáá»ááºážááŒááºááá«áááºá áá°ááá¯á·ááᯠáá¬ážáá²á·ááá¯ááºáá¡á±á¬ááº-
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;
áá¶áá«ááºá ááºáááºáá¬ážáá±á¬á á¬ááŒá±á¬ááºážááááºááá¯ážááẠáá»áœááºá¯ááºááá¯á·á¡ááœáẠá áááºááááºá á¬ážáá±á¬ááŒá±á¬áá·áºá áá»áœááºá¯ááºááá¯á·ááẠáááºážááᯠááŒááºáá±ážáá¬ážáá±á¬ áá±á¬áºáá¶áá»á¬ážáá²á០ááá¯ážááá¯ážááŸááºážááŸááºáž áá¯ááºáá áºááá¯ááºáá«áááºá
áá¯ááºá áá¬á¡áááºážáááºáá»ááºáá±ážááẠ- áá»áœááºá¯ááºááá¯á·áááŸááá¬ážáá±á¬ set ááá¯á¡áá¯á¶ážááŒá¯á 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[]);
ááááááá¯ááºááᯠá á áºáá±ážááŒáá·áºáá¡á±á¬ááºá
áá¯ááºáá«áááºá á¡á¬ážáá¯á¶ážááŸááºáá«áááº- áá»áœááºá¯ááºááá¯á·á ááŸááºáááºáž 3 áá¯ááᯠááá¬ážáá áºáá¯áá¯á¶ážá Seq Scan á¡ááœáẠááœá±ážáá»ááºáá¬ážááŒá®áž áá±áá¬ááŸá¬ááœá±ááẠDelete node ááᯠá¡áá¯á¶ážááŒá¯áá¬ážáááºá Tid Scan ááŒáá·áº single pass:
-> 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;
ááá¯á·ááŒá±á¬áá·áº áááºážáááºážááᯠá¡á±á¬ááºááŒááºá
áœá¬ áá¯ááºáá±á¬ááºááá¯ááºáá±á¬áºáááºáž á¡áá»áá¯á·áá±á¬ áááááŒáá·áº á¡áá¯á¶ážááŒá¯ááá«áááºá áá»ááºááá¯ááºáá±á¬ ááŸááºáááºážááá¯ááºážá¡ááœáẠTid Scan ááœááºáááºáá±á¬ áá±áá¬á
á¬áá»ááºááŸá¬áá
áºáá¯ááŸáááŒá®áž áá»ááºáááºááá¯áá«á áá
áºáá¯ááŸááááºá
source: www.habr.com