แแ แแก แกแแขแฃแแชแแแแ, แ แแแแกแแช แแแแแแแแ แแแ แแแแแแ แแแกแแฆแแแแก แแแ แแจแ แแ แกแฎแแ แฃแแแแแแฃแ แ แแแแแฅแกแ, แแแแแแฎแแแแแแแแแก แแแแ, แจแแแแก แฃแแแ แแ แกแแแฃแแ แฉแแแแฌแแ แแแแก แกแ แฃแแ แแแแแแแ.
แแแแแแแแแ, แฅแ แแแแแแแแฃแ แ แแแขแ แแแแก แแแแจแแแแแแแแแ แแฌแแ แแแ PostgreSQL-แจแ COPY แแแแแแแก แแแแแงแแแแแแ, แจแแแแแ แฎแแแแ แแแฃแแแแแแแ แแแ แชแฎแ แแ แกแ แฃแแแแ แแแแแขแฃแ แ แแแแแชแแแแแแก แแแฌแแแ แแแแแ แแแแแก.
แ แแแแ แแแแแแแแแกแฃแคแแแ แแแแแชแแแแ แแแแ แแ แแกแแญแแ แ แแแแแแแแกแแแ?
แ แแแแกแแช 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}
แฒจแแแแฉแแแ? แแแแแ 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
แแแแฎ, แฉแแแ แแแจแแแแ แแฎแแแแแ, แ แแ แแฃ แแแกแแแจแ แแ แแแ แแแขแ แฉแแแแฌแแ แแ, แแก แงแแแแแคแแ แ แแแแแแแแ. แแแแแ, แฃแแ แแแแ แแแแขแแแแ แแกแแแ:
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-แจแ แแ แแ แแ แฌแแจแแแจแ.
แฌแงแแ แ: www.habr.com