PK āĻ›āĻžāĻĄāĻŧāĻž āĻāĻ•āĻŸāĻŋ āĻŸā§‡āĻŦāĻŋāĻ˛ āĻĨā§‡āĻ•ā§‡ āĻ•ā§āĻ˛ā§‹āĻ¨ āĻ°ā§‡āĻ•āĻ°ā§āĻĄ āĻ¸āĻžāĻĢ āĻ•āĻ°āĻž

āĻĒāĻ°āĻŋāĻ¸ā§āĻĨāĻŋāĻ¤āĻŋ āĻ†āĻ›ā§‡ āĻ¯āĻ–āĻ¨ āĻāĻ•āĻŸāĻŋ āĻĒā§āĻ°āĻžāĻĨāĻŽāĻŋāĻ• āĻ•ā§€ āĻ›āĻžāĻĄāĻŧāĻž āĻāĻ•āĻŸāĻŋ āĻŸā§‡āĻŦāĻŋāĻ˛ā§‡ āĻŦāĻž āĻ…āĻ¨ā§āĻ¯ āĻ•āĻŋāĻ›ā§ āĻ…āĻ¨āĻ¨ā§āĻ¯ āĻ¸ā§‚āĻšāĻ•, āĻāĻ•āĻŸāĻŋ āĻ¤āĻ¤ā§āĻ¤ā§āĻŦāĻžāĻŦāĻ§āĻžāĻ¨ā§‡āĻ° āĻ•āĻžāĻ°āĻŖā§‡, āĻ‡āĻ¤āĻŋāĻŽāĻ§ā§āĻ¯ā§‡ āĻŦāĻŋāĻĻā§āĻ¯āĻŽāĻžāĻ¨ āĻ°ā§‡āĻ•āĻ°ā§āĻĄā§‡āĻ° āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻ•ā§āĻ˛ā§‹āĻ¨ āĻ…āĻ¨ā§āĻ¤āĻ°ā§āĻ­ā§āĻ•ā§āĻ¤ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡āĨ¤

PK āĻ›āĻžāĻĄāĻŧāĻž āĻāĻ•āĻŸāĻŋ āĻŸā§‡āĻŦāĻŋāĻ˛ āĻĨā§‡āĻ•ā§‡ āĻ•ā§āĻ˛ā§‹āĻ¨ āĻ°ā§‡āĻ•āĻ°ā§āĻĄ āĻ¸āĻžāĻĢ āĻ•āĻ°āĻž

āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§‚āĻĒ, āĻāĻ•āĻŸāĻŋ āĻ•āĻžāĻ˛āĻžāĻ¨ā§āĻ•ā§āĻ°āĻŽāĻŋāĻ• āĻŽā§‡āĻŸā§āĻ°āĻŋāĻ•ā§‡āĻ° āĻŽāĻžāĻ¨āĻ—ā§āĻ˛āĻŋ āĻāĻ•āĻŸāĻŋ āĻ•āĻĒāĻŋ āĻ¸ā§āĻŸā§āĻ°āĻŋāĻŽ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ PostgreSQL āĻ āĻ˛ā§‡āĻ–āĻž āĻšāĻ¯āĻŧ, āĻāĻŦāĻ‚ āĻ¤āĻžāĻ°āĻĒāĻ°ā§‡ āĻšāĻ āĻžā§Ž āĻŦā§āĻ¯āĻ°ā§āĻĨ āĻšāĻ¯āĻŧ āĻāĻŦāĻ‚ āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻ…āĻ­āĻŋāĻ¨ā§āĻ¨ āĻĄā§‡āĻŸāĻžāĻ° āĻ…āĻ‚āĻļ āĻ†āĻŦāĻžāĻ° āĻ†āĻ¸ā§‡āĨ¤

āĻ…āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ā§€āĻ¯āĻŧ āĻ•ā§āĻ˛ā§‹āĻ¨ āĻĄāĻžāĻŸāĻžāĻŦā§‡āĻ¸ āĻĒāĻ°āĻŋāĻ¤ā§āĻ°āĻžāĻŖ āĻ•āĻŋāĻ­āĻžāĻŦā§‡?

āĻ¯āĻ–āĻ¨ āĻĒāĻŋāĻ•ā§‡ āĻ¸āĻžāĻšāĻžāĻ¯ā§āĻ¯āĻ•āĻžāĻ°ā§€ āĻ¨āĻ¯āĻŧ

āĻ¸āĻŦāĻšā§‡āĻ¯āĻŧā§‡ āĻ¸āĻšāĻœ āĻ‰āĻĒāĻžāĻ¯āĻŧ āĻšāĻ˛ āĻĒā§āĻ°āĻĨāĻŽ āĻ¸ā§āĻĨāĻžāĻ¨ā§‡ āĻāĻ‡ āĻ§āĻ°āĻ¨ā§‡āĻ° āĻĒāĻ°āĻŋāĻ¸ā§āĻĨāĻŋāĻ¤āĻŋ āĻĨā§‡āĻ•ā§‡ āĻ°āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻžāĨ¤ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§‚āĻĒ, āĻĒā§āĻ°āĻžāĻĨāĻŽāĻŋāĻ• āĻ•ā§€ āĻ°ā§‹āĻ˛ āĻ•āĻ°ā§āĻ¨āĨ¤ āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻ¸āĻžā§āĻšāĻŋāĻ¤ āĻĄā§‡āĻŸāĻžāĻ° āĻ­āĻ˛āĻŋāĻ‰āĻŽ āĻŦāĻžāĻĄāĻŧāĻžāĻ¨ā§‹ āĻ›āĻžāĻĄāĻŧāĻž āĻāĻŸāĻŋ āĻ¸āĻŦāĻ¸āĻŽāĻ¯āĻŧ āĻ¸āĻŽā§āĻ­āĻŦ āĻ¨āĻ¯āĻŧāĨ¤

āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§‚āĻĒ, āĻ¯āĻĻāĻŋ āĻ‰ā§ŽāĻ¸ āĻ¸āĻŋāĻ¸ā§āĻŸā§‡āĻŽā§‡āĻ° āĻ¨āĻŋāĻ°ā§āĻ­ā§āĻ˛āĻ¤āĻž āĻĄāĻžāĻŸāĻžāĻŦā§‡āĻ¸ā§‡āĻ° āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡āĻ° āĻ¨āĻŋāĻ°ā§āĻ­ā§āĻ˛āĻ¤āĻžāĻ° āĻšā§‡āĻ¯āĻŧā§‡ āĻŦā§‡āĻļāĻŋ āĻšāĻ¯āĻŧ:

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, āĻĄā§‡āĻŸāĻž) - āĻ¤āĻŦā§‡ āĻāĻŸāĻŋ āĻāĻ° āĻ­āĻ˛āĻŋāĻ‰āĻŽāĻ•ā§‡ āĻŦā§āĻ¯āĻžāĻĒāĻ•āĻ­āĻžāĻŦā§‡ āĻŦā§ƒāĻĻā§āĻ§āĻŋ āĻ•āĻ°āĻŦā§‡, āĻ¯āĻž āĻ†āĻŽāĻ°āĻž āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻŦ āĻ¨āĻžāĨ¤

āĻ…āĻ¤āĻāĻŦ, āĻ¸āĻŦāĻšā§‡āĻ¯āĻŧā§‡ āĻ¸āĻ āĻŋāĻ• āĻŦāĻŋāĻ•āĻ˛ā§āĻĒ āĻšāĻ˛ āĻāĻ•āĻŸāĻŋ āĻ¨āĻŋāĻ¯āĻŧāĻŽāĻŋāĻ¤ āĻ…-āĻ…āĻ¨āĻ¨ā§āĻ¯ āĻ¸ā§‚āĻšāĻ• āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻž (āĻŽā§‡āĻŸā§āĻ°āĻŋāĻ•, āĻŸāĻŋāĻāĻ¸) āĻāĻŦāĻ‚ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻ¤āĻžāĻ° āĻĒāĻ° āĻ¸āĻŽāĻ¸ā§āĻ¯āĻž āĻĻā§‡āĻ–āĻž āĻĻāĻŋāĻ˛ā§‡ āĻŽā§‹āĻ•āĻžāĻŦā§‡āĻ˛āĻž āĻ•āĻ°ā§āĻ¨āĨ¤

"āĻ•ā§āĻ˛ā§‹āĻ¨āĻŋāĻ• āĻ¯ā§āĻĻā§āĻ§ āĻļā§āĻ°ā§ āĻšāĻ¯āĻŧā§‡āĻ›ā§‡"

āĻ•āĻŋāĻ›ā§ āĻ§āĻ°āĻŖā§‡āĻ° āĻĻā§āĻ°ā§āĻ˜āĻŸāĻ¨āĻž āĻ˜āĻŸā§‡āĻ›ā§‡, āĻāĻŦāĻ‚ āĻāĻ–āĻ¨ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻŸā§‡āĻŦāĻŋāĻ˛ āĻĨā§‡āĻ•ā§‡ āĻ•ā§āĻ˛ā§‹āĻ¨ āĻ°ā§‡āĻ•āĻ°ā§āĻĄāĻ—ā§āĻ˛āĻŋ āĻ§ā§āĻŦāĻ‚āĻ¸ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡āĨ¤

PK āĻ›āĻžāĻĄāĻŧāĻž āĻāĻ•āĻŸāĻŋ āĻŸā§‡āĻŦāĻŋāĻ˛ āĻĨā§‡āĻ•ā§‡ āĻ•ā§āĻ˛ā§‹āĻ¨ āĻ°ā§‡āĻ•āĻ°ā§āĻĄ āĻ¸āĻžāĻĢ āĻ•āĻ°āĻž

āĻ†āĻ¸āĻ˛ āĻĄā§‡āĻŸāĻž āĻŽāĻĄā§‡āĻ˛ āĻ•āĻ°āĻž āĻ¯āĻžāĻ•:

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 āĻĻā§āĻŦāĻžāĻ°āĻž āĻ¸āĻŽā§āĻŦā§‹āĻ§āĻ¨, āĻāĻ•āĻŸāĻŋ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻ°ā§‡āĻ•āĻ°ā§āĻĄā§‡āĻ° āĻļāĻžāĻ°ā§€āĻ°āĻŋāĻ• āĻļāĻ¨āĻžāĻ•ā§āĻ¤āĻ•āĻžāĻ°ā§€āĨ¤

āĻ…āĻ°ā§āĻĨāĻžā§Ž, āĻĒā§āĻ°āĻĨāĻŽāĻ¤, āĻŸā§‡āĻŦāĻŋāĻ˛ā§‡āĻ° āĻ¸āĻžāĻ°āĻŋāĻ° āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻŦāĻŋāĻˇāĻ¯āĻŧāĻŦāĻ¸ā§āĻ¤ā§āĻ° āĻĒā§āĻ°āĻ¸āĻ™ā§āĻ—ā§‡ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ°ā§‡āĻ•āĻ°ā§āĻĄā§‡āĻ° 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[]);

āĻ†āĻ¸ā§āĻ¨ āĻ¨āĻŋāĻœā§‡āĻĻā§‡āĻ° āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻž āĻ¯āĻžāĻ•:

PK āĻ›āĻžāĻĄāĻŧāĻž āĻāĻ•āĻŸāĻŋ āĻŸā§‡āĻŦāĻŋāĻ˛ āĻĨā§‡āĻ•ā§‡ āĻ•ā§āĻ˛ā§‹āĻ¨ āĻ°ā§‡āĻ•āĻ°ā§āĻĄ āĻ¸āĻžāĻĢ āĻ•āĻ°āĻž
[explain.tensor.ru āĻĻā§‡āĻ–ā§āĻ¨]

āĻšā§āĻ¯āĻžāĻ, āĻ¸āĻŦāĻ•āĻŋāĻ›ā§āĻ‡ āĻ¸āĻ āĻŋāĻ•: āĻ†āĻŽāĻžāĻĻā§‡āĻ° 3āĻŸāĻŋ āĻ°ā§‡āĻ•āĻ°ā§āĻĄ āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻŸā§‡āĻŦāĻŋāĻ˛ā§‡āĻ° āĻāĻ•āĻŽāĻžāĻ¤ā§āĻ° Seq āĻ¸ā§āĻ•ā§āĻ¯āĻžāĻ¨ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ¨āĻŋāĻ°ā§āĻŦāĻžāĻšāĻ¨ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›āĻŋāĻ˛ āĻāĻŦāĻ‚ āĻĄā§‡āĻŸāĻž āĻ…āĻ¨ā§āĻ¸āĻ¨ā§āĻ§āĻžāĻ¨ āĻ•āĻ°āĻ¤ā§‡ āĻĄāĻŋāĻ˛āĻŋāĻŸ āĻ¨ā§‹āĻĄ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›āĻŋāĻ˛ āĻŸāĻŋāĻĄ āĻ¸ā§āĻ•ā§āĻ¯āĻžāĻ¨ āĻ¸āĻš āĻāĻ•āĻ• āĻĒāĻžāĻ¸:

->  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;

PK āĻ›āĻžāĻĄāĻŧāĻž āĻāĻ•āĻŸāĻŋ āĻŸā§‡āĻŦāĻŋāĻ˛ āĻĨā§‡āĻ•ā§‡ āĻ•ā§āĻ˛ā§‹āĻ¨ āĻ°ā§‡āĻ•āĻ°ā§āĻĄ āĻ¸āĻžāĻĢ āĻ•āĻ°āĻž
[explain.tensor.ru āĻĻā§‡āĻ–ā§āĻ¨]

āĻ¸ā§āĻ¤āĻ°āĻžāĻ‚, āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻŸāĻŋ āĻ¸āĻĢāĻ˛āĻ­āĻžāĻŦā§‡ āĻ•āĻžāĻœ āĻ•āĻ°ā§‡, āĻ¤āĻŦā§‡ āĻāĻŸāĻŋ āĻ…āĻŦāĻļā§āĻ¯āĻ‡ āĻ•āĻŋāĻ›ā§ āĻ¸āĻ¤āĻ°ā§āĻ•āĻ¤āĻžāĻ° āĻ¸āĻžāĻĨā§‡ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻ‰āĻšāĻŋāĻ¤āĨ¤ āĻ•āĻžāĻ°āĻŖ āĻŽā§āĻ›ā§‡ āĻĢā§‡āĻ˛āĻž āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻ°ā§‡āĻ•āĻ°ā§āĻĄā§‡āĻ° āĻœāĻ¨ā§āĻ¯, āĻŸāĻŋāĻĄ āĻ¸ā§āĻ•ā§āĻ¯āĻžāĻ¨ā§‡ āĻāĻ•āĻŸāĻŋ āĻĄā§‡āĻŸāĻž āĻĒā§ƒāĻˇā§āĻ āĻž āĻĒāĻĄāĻŧāĻž āĻšāĻ¯āĻŧ āĻāĻŦāĻ‚ āĻāĻ•āĻŸāĻŋ āĻŽā§āĻ›ā§‡ āĻĢā§‡āĻ˛āĻž āĻšāĻ¯āĻŧāĨ¤

āĻ‰āĻ¤ā§āĻ¸: www.habr.com

āĻāĻ•āĻŸāĻŋ āĻŽāĻ¨ā§āĻ¤āĻŦā§āĻ¯ āĻœā§āĻĄāĻŧā§āĻ¨