ืืฉ ืืฆืืื ืฉืืื ืืืืื ืืื ืืคืชื ืจืืฉื ืื ืืื ืืงืก ืืืืืื ืืืจ, ืขืงื ืคืืงืื, ืืืืืื ืฉืืืืืื ืฉืืืื ืฉื ืจืฉืืืืช ืฉืืืจ ืงืืืืืช.
ืืืืืื, ืืขืจืืื ืฉื ืืื ืืจืื ืืืืื ื ืืชืืื ืืชืื PostgreSQL ืืืืฆืขืืช ืืจื COPY, ืืื ืืฉ ืืฉื ืคืชืืืื, ืืืืง ืืื ืชืื ืื ืืืืื ืืืืืืื ืืืืข ืฉืื.
ืืื ื ืคืืจืื ืืืืืืจ ืืฉืืืื ืืืืชืจืื?
ืืฉืค"ืง ืืื ื ืขืืืจ
ืืืจื ืืงืื ืืืืชืจ ืืื ืืื ืืข ืืฆื ืืื ืืืืชืืืื. ืืืืืื, ืืืื ืืช 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 ืฉื ืื ืงืืื ืืื, ืืื ื ืฉืืจื ืื ืชืงืคื ืื ืงืืืช ืืื ืฉื ืืืฉืื (ืืืจื ืืื, ืขืจืื ืื ืชืื ืื ืฉืื ืื!).
ืืืืื ืฉืืชื ืืืื ืืขืฉืืช ืืช ืื PK(ืืืจื, ts) - ืืื ืื ื ืงืื ืืชื ืืฉืืืืช ืืื ืกื ืขืืืจ ื ืชืื ืื ืืืงืืื.
ืืืื ืืขืฉืืช PK(metric, ts, data) - ืืื ืื ืืืืื ืืืื ืืช ืื ืคื ืฉืื, ืฉืื ื ืฉืชืืฉ ืื.
ืืื, ืืืคืฉืจืืช ืื ืืื ื ืืืืชืจ ืืื ืืขืฉืืช ืืื ืืงืก ืจืืื ืฉืืื ื ืืืืืื (ืืื, 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[]);
ืืืื ื ืืืืง ืืช ืขืฆืื ื:
ืื, ืืื ื ืืื: 3 ืืจืฉืืืืช ืฉืื ื ื ืืืจื ื-Seq Scan ืืืืืื ืฉื ืื ืืืืื, ืืืฆืืืช Delete ืฉืืืฉ ืืืืคืืฉ ื ืชืื ืื ืืขืืจ ืืืื ืขื Tid Scan:
-> 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, ืืืื ื-Delete.
ืืงืืจ: www.habr.com