เชเชตเซ เชชเชฐเชฟเชธเซเชฅเชฟเชคเชฟเช เชเซ เชเซเชฏเชพเชฐเซ เชชเซเชฐเชพเชฅเชฎเชฟเช เชเซ เชตเชเชฐเชจเชพ เชเซเชฌเชฒ เชชเชฐ เช เชฅเชตเชพ เช เชฎเซเช เช เชจเซเชฏ เช เชจเชจเซเชฏ เช เชจเซเชเซเชฐเชฎเชฃเชฟเชเชพ, เชฆเซเชเชฐเซเชเชจเซ เชเชพเชฐเชฃเซ, เชชเชนเซเชฒเชพเชฅเซ เช เชธเซเชคเชฟเชคเซเชตเชฎเชพเช เชเซ เชคเซเชตเชพ เชฐเซเชเซเชฐเซเชกเซเชธเชจเชพ เชธเชเชชเซเชฐเซเชฃ เชเซเชฒเซเชจเซเชธเชจเซ เชธเชฎเชพเชตเซเชถ เชฅเชพเชฏ เชเซ.
เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, เชเชพเชฒเชเซเชฐเชฎเชฟเช เชฎเซเชเซเชฐเชฟเชเชจเชพ เชฎเซเชฒเซเชฏเซ เชชเซเชธเซเชเชเซเชฐเซเชเชธเชเซเชฏเซเชเชฒเชฎเชพเช เชเซเชชเซ เชธเซเชเซเชฐเซเชฎเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชฒเชเชตเชพเชฎเชพเช เชเชตเซ เชเซ, เช
เชจเซ เชชเชเซ เช
เชเชพเชจเช เชจเชฟเชทเซเชซเชณเชคเชพ เชเชตเซ เชเซ, เช
เชจเซ เชธเชเชชเซเชฐเซเชฃเชชเชฃเซ เชธเชฎเชพเชจ เชกเซเชเชพเชจเซ เชญเชพเช เชซเชฐเซเชฅเซ เชเชตเซ เชเซ.
เชฌเชฟเชจเชเชฐเซเชฐเซ เชเซเชฒเซเชจเซเชธเชจเชพ เชกเซเชเชพเชฌเซเชเชฅเซ เชเซเชตเซ เชฐเซเชคเซ เชเซเชเชเชพเชฐเซ เชฎเซเชณเชตเชตเซ?
เชเซเชฏเชพเชฐเซ เชชเซเชเซ เชฎเชฆเชฆเชเชพเชฐ เชจเชฅเซ
เชเชตเซ เชชเชฐเชฟเชธเซเชฅเชฟเชคเชฟเชจเซ เชชเซเชฐเชฅเชฎ เชธเซเชฅเชพเชจเซ เชฌเชจเชคเชพ เช เชเชเชพเชตเชตเชพเชจเซ เชธเซเชฅเซ เชธเชนเซเชฒเซ เชฐเชธเซเชคเซ เชเซ. เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, เชชเซเชฐเชพเชฅเชฎเชฟเช เชเซ เชฐเซเชฒ เชเชฐเซ. เชชเชฐเชเชคเซ เชธเชเชเซเชฐเชนเชฟเชค เชกเซเชเชพเชจเชพ เชตเซเชฒเซเชฏเซเชฎเชฎเชพเช เชตเชงเชพเชฐเซ เชเชฐเซเชฏเชพ เชตเชฟเชจเชพ เช เชนเชเชฎเซเชถเชพ เชถเชเซเชฏ เชจเชฅเซ.
เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, เชเซ เชธเซเชฐเซเชค เชธเชฟเชธเซเชเชฎเชจเซ เชเซเชเชธเชพเช เชกเซเชเชพเชฌเซเชเชฎเชพเชเชจเชพ เชเซเชทเซเชคเซเชฐเชจเซ เชเซเชเชธเชพเช เชเชฐเชคเชพ เชตเชงเชพเชฐเซ เชเซ:
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 เชฐเซเชเซเชฐเซเชก เชเชเชพ เชเซเชฌเชฒเชจเชพ เชเชเชฎเชพเชคเซเชฐ เชธเซเช เชธเซเชเซเชจ เชฎเชพเชเซ เชชเชธเชเชฆ เชเชฐเชตเชพเชฎเชพเช เชเชตเซเชฏเชพ เชนเชคเชพ, เช เชจเซ เชกเชฟเชฒเซเช เชจเซเชกเชจเซ เชเชชเชฏเซเช เชกเซเชเชพ เชถเซเชงเชตเชพ เชฎเชพเชเซ เชเชฐเชตเชพเชฎเชพเช เชเชตเซเชฏเซ เชนเชคเซ. เชเซเชก เชธเซเชเซเชจ เชธเชพเชฅเซ เชธเชฟเชเชเชฒ เชชเชพเชธ:
-> 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