āĻĒā§‹āĻ¸ā§āĻŸāĻ—ā§āĻ°ā§‡āĻāĻ¸āĻ•āĻŋāĻ‰āĻāĻ˛ āĻ…ā§āĻ¯āĻžāĻ¨ā§āĻŸāĻŋāĻĒā§āĻ¯āĻžāĻŸāĻžāĻ°ā§āĻ¨āĻ¸: āĻ†āĻ¸ā§āĻ¨ āĻāĻ•āĻŸāĻŋ āĻ…āĻ­āĻŋāĻ§āĻžāĻ¨ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ­āĻžāĻ°ā§€ āĻ¯ā§‹āĻ—āĻĻāĻžāĻ¨ āĻ•āĻ°āĻŋ

āĻ†āĻŽāĻ°āĻž "āĻ†āĻĒāĻžāĻ¤āĻĻā§ƒāĻˇā§āĻŸāĻŋāĻ¤ā§‡ āĻ¸āĻšāĻœ" PostgreSQL āĻĒā§āĻ°āĻļā§āĻ¨āĻ—ā§āĻ˛āĻŋāĻ° āĻ•āĻžāĻ°ā§āĻ¯āĻ•āĻžāĻ°āĻŋāĻ¤āĻž āĻ‰āĻ¨ā§āĻ¨āĻ¤ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ¸ā§āĻŦāĻ˛ā§āĻĒ-āĻĒāĻ°āĻŋāĻšāĻŋāĻ¤ āĻ‰āĻĒāĻžāĻ¯āĻŧāĻ—ā§āĻ˛āĻŋāĻ° āĻ…āĻ§ā§āĻ¯āĻ¯āĻŧāĻ¨ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ‰āĻ¤ā§āĻ¸āĻ°ā§āĻ—ā§€āĻ•ā§ƒāĻ¤ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻ—ā§āĻ˛āĻŋāĻ° āĻ¸āĻŋāĻ°āĻŋāĻœāĻŸāĻŋ āĻšāĻžāĻ˛āĻŋāĻ¯āĻŧā§‡ āĻ¯āĻžāĻšā§āĻ›āĻŋ:

āĻ­āĻžāĻŦāĻŦā§‡āĻ¨ āĻ¨āĻž āĻ¯ā§‡ āĻ†āĻŽāĻŋ āĻœāĻ¯āĻŧā§‡āĻ¨ āĻ•āĻ°āĻ¤ā§‡ āĻ–ā§āĻŦ āĻāĻ•āĻŸāĻž āĻĒāĻ›āĻ¨ā§āĻĻ āĻ•āĻ°āĻŋ āĻ¨āĻž... :)

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

āĻĒā§‹āĻ¸ā§āĻŸāĻ—ā§āĻ°ā§‡āĻāĻ¸āĻ•āĻŋāĻ‰āĻāĻ˛ āĻ…ā§āĻ¯āĻžāĻ¨ā§āĻŸāĻŋāĻĒā§āĻ¯āĻžāĻŸāĻžāĻ°ā§āĻ¨āĻ¸: āĻ†āĻ¸ā§āĻ¨ āĻāĻ•āĻŸāĻŋ āĻ…āĻ­āĻŋāĻ§āĻžāĻ¨ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ­āĻžāĻ°ā§€ āĻ¯ā§‹āĻ—āĻĻāĻžāĻ¨ āĻ•āĻ°āĻŋ

PostgreSQL 12 āĻĻāĻŋāĻ¯āĻŧā§‡ āĻļā§āĻ°ā§ āĻ•āĻ°ā§‡, āĻ¨ā§€āĻšā§‡ āĻŦāĻ°ā§āĻŖāĻŋāĻ¤ āĻ•āĻŋāĻ›ā§ āĻĒāĻ°āĻŋāĻ¸ā§āĻĨāĻŋāĻ¤āĻŋāĻ° āĻ•āĻžāĻ°āĻŖā§‡ āĻ•āĻŋāĻ›ā§āĻŸāĻž āĻ­āĻŋāĻ¨ā§āĻ¨āĻ­āĻžāĻŦā§‡ āĻĒā§āĻ¨āĻ°ā§āĻ¤ā§āĻĒāĻžāĻĻāĻ¨ āĻ•āĻ°āĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡ āĻĄāĻŋāĻĢāĻ˛ā§āĻŸ āĻ¨āĻ¨-āĻŽā§‡āĻŸā§‡āĻ°āĻŋāĻ¯āĻŧāĻžāĻ˛āĻžāĻ‡āĻœā§‡āĻļāĻ¨ CTE. āĻ•ā§€ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻ•āĻ°ā§‡ āĻāĻ‡ āĻ†āĻšāĻ°āĻŖāĻŸāĻŋ āĻĒā§āĻ°āĻ¤ā§āĻ¯āĻžāĻŦāĻ°ā§āĻ¤āĻ¨ āĻ•āĻ°āĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡ MATERIALIZED.

āĻ¸ā§€āĻŽāĻŋāĻ¤ āĻļāĻŦā§āĻĻāĻ­āĻžāĻ¨ā§āĻĄāĻžāĻ°ā§‡ āĻĒā§āĻ°āĻšā§āĻ° "āĻ¤āĻĨā§āĻ¯"

āĻāĻ•āĻŸāĻŋ āĻ–ā§āĻŦ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ āĻ•āĻžāĻœ āĻ¨ā§‡āĻ“āĻ¯āĻŧāĻž āĻ¯āĻžāĻ• - āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻ¤āĻžāĻ˛āĻŋāĻ•āĻž āĻĒā§āĻ°āĻĻāĻ°ā§āĻļāĻ¨ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡ āĻ‡āĻ¨āĻ•āĻžāĻŽāĻŋāĻ‚ āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻ…āĻĨāĻŦāĻž āĻĒā§āĻ°ā§‡āĻ°āĻ•āĻĻā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ¸āĻ•ā§āĻ°āĻŋāĻ¯āĻŧ āĻ•āĻžāĻœ:

25.01 | ИваĐŊОв И.И. | ПодĐŗĐžŅ‚ОвиŅ‚ŅŒ ĐžĐŋиŅĐ°ĐŊиĐĩ ĐŊОвОĐŗĐž Đ°ĐģĐŗĐžŅ€Đ¸Ņ‚ĐŧĐ°.
22.01 | ИваĐŊОв И.И. | НаĐŋиŅĐ°Ņ‚ŅŒ ŅŅ‚Đ°Ņ‚ŅŒŅŽ ĐŊĐ° ĐĨĐ°ĐąŅ€: ĐļиСĐŊŅŒ ĐąĐĩС JOIN.
20.01 | ПĐĩŅ‚Ņ€ĐžĐ˛ П.П. | ПоĐŧĐžŅ‡ŅŒ ĐžĐŋŅ‚иĐŧиСиŅ€ĐžĐ˛Đ°Ņ‚ŅŒ СаĐŋŅ€ĐžŅ.
18.01 | ИваĐŊОв И.И. | НаĐŋиŅĐ°Ņ‚ŅŒ ŅŅ‚Đ°Ņ‚ŅŒŅŽ ĐŊĐ° ĐĨĐ°ĐąŅ€: JOIN Ņ ŅƒŅ‡ĐĩŅ‚ĐžĐŧ Ņ€Đ°ŅĐŋŅ€ĐĩĐ´ĐĩĐģĐĩĐŊиŅ Đ´Đ°ĐŊĐŊŅ‹Ņ….
16.01 | ПĐĩŅ‚Ņ€ĐžĐ˛ П.П. | ПоĐŧĐžŅ‡ŅŒ ĐžĐŋŅ‚иĐŧиСиŅ€ĐžĐ˛Đ°Ņ‚ŅŒ СаĐŋŅ€ĐžŅ.

āĻŦāĻŋāĻŽā§‚āĻ°ā§āĻ¤ āĻŦāĻŋāĻļā§āĻŦā§‡, āĻŸāĻžāĻ¸ā§āĻ• āĻ˛ā§‡āĻ–āĻ•āĻĻā§‡āĻ° āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻĒā§āĻ°āĻ¤āĻŋāĻˇā§āĻ āĻžāĻ¨ā§‡āĻ° āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻ•āĻ°ā§āĻŽā§€āĻĻā§‡āĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻ¸āĻŽāĻžāĻ¨āĻ­āĻžāĻŦā§‡ āĻŦāĻŋāĻ¤āĻ°āĻŖ āĻ•āĻ°āĻž āĻ‰āĻšāĻŋāĻ¤, āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦā§‡ āĻ•āĻžāĻ°ā§āĻ¯āĻ—ā§āĻ˛āĻŋ āĻāĻ•āĻŸāĻŋ āĻ¨āĻŋāĻ¯āĻŧāĻŽ āĻšāĻŋāĻ¸āĻžāĻŦā§‡, āĻŽā§‹āĻŸāĻžāĻŽā§āĻŸāĻŋ āĻ¸ā§€āĻŽāĻŋāĻ¤ āĻ¸āĻ‚āĻ–ā§āĻ¯āĻ• āĻ˛ā§‹āĻ•ā§‡āĻ° āĻ•āĻžāĻ› āĻĨā§‡āĻ•ā§‡ āĻ†āĻ¸ā§‡ - "āĻŦā§āĻ¯āĻŦāĻ¸ā§āĻĨāĻžāĻĒāĻ¨āĻž āĻĨā§‡āĻ•ā§‡" āĻ…āĻ¨ā§āĻ•ā§āĻ°āĻŽā§‡āĻ° āĻ‰āĻĒāĻ°ā§‡ āĻŦāĻž "āĻ¸āĻžāĻŦāĻ•āĻ¨ā§āĻŸā§āĻ°āĻžāĻ•ā§āĻŸāĻ°āĻĻā§‡āĻ° āĻĨā§‡āĻ•ā§‡" āĻĒā§āĻ°āĻ¤āĻŋāĻŦā§‡āĻļā§€ āĻŦāĻŋāĻ­āĻžāĻ— āĻĨā§‡āĻ•ā§‡ (āĻŦāĻŋāĻļā§āĻ˛ā§‡āĻˇāĻ•, āĻĄāĻŋāĻœāĻžāĻ‡āĻ¨āĻžāĻ°, āĻŽāĻžāĻ°ā§āĻ•ā§‡āĻŸāĻŋāĻ‚, ...)āĨ¤

āĻ†āĻ¸ā§āĻ¨ āĻ†āĻŽāĻ°āĻž āĻ¸ā§āĻŦā§€āĻ•āĻžāĻ° āĻ•āĻ°āĻŋ āĻ¯ā§‡ āĻ†āĻŽāĻžāĻĻā§‡āĻ° 1000 āĻœāĻ¨ā§‡āĻ° āĻ¸āĻ‚āĻ—āĻ āĻ¨ā§‡, āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° 20 āĻœāĻ¨ āĻ˛ā§‡āĻ–āĻ• (āĻ¸āĻžāĻ§āĻžāĻ°āĻŖāĻ¤ āĻāĻŽāĻ¨āĻ•āĻŋ āĻ•āĻŽ) āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻĒāĻžāĻ°āĻĢāĻ°ā§āĻŽāĻžāĻ°ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ•āĻžāĻœāĻ—ā§āĻ˛āĻŋ āĻ¸ā§‡āĻŸ āĻ•āĻ°ā§‡āĻ¨ āĻāĻŦāĻ‚ āĻ†āĻ¸ā§āĻ¨ āĻāĻ‡ āĻŦāĻŋāĻˇāĻ¯āĻŧ āĻœā§āĻžāĻžāĻ¨ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻ¯āĻžāĻ•"āĻāĻ¤āĻŋāĻšā§āĻ¯āĻŦāĻžāĻšā§€" āĻĒā§āĻ°āĻļā§āĻ¨ā§‡āĻ° āĻ—āĻ¤āĻŋ āĻŦāĻžāĻĄāĻŧāĻžāĻ¤ā§‡āĨ¤

āĻ¸ā§āĻ•ā§āĻ°āĻŋāĻĒā§āĻŸ āĻœā§‡āĻ¨āĻžāĻ°ā§‡āĻŸāĻ°

-- ŅĐžŅ‚Ņ€ŅƒĐ´ĐŊиĐēи
CREATE TABLE person AS
SELECT
  id
, repeat(chr(ascii('a') + (id % 26)), (id % 32) + 1) "name"
, '2000-01-01'::date - (random() * 1e4)::integer birth_date
FROM
  generate_series(1, 1000) id;

ALTER TABLE person ADD PRIMARY KEY(id);

-- СадаŅ‡Đ¸ Ņ ŅƒĐēаСаĐŊĐŊŅ‹Đŧ Ņ€Đ°ŅĐŋŅ€ĐĩĐ´ĐĩĐģĐĩĐŊиĐĩĐŧ
CREATE TABLE task AS
WITH aid AS (
  SELECT
    id
  , array_agg((random() * 999)::integer + 1) aids
  FROM
    generate_series(1, 1000) id
  , generate_series(1, 20)
  GROUP BY
    1
)
SELECT
  *
FROM
  (
    SELECT
      id
    , '2020-01-01'::date - (random() * 1e3)::integer task_date
    , (random() * 999)::integer + 1 owner_id
    FROM
      generate_series(1, 100000) id
  ) T
, LATERAL(
    SELECT
      aids[(random() * (array_length(aids, 1) - 1))::integer + 1] author_id
    FROM
      aid
    WHERE
      id = T.owner_id
    LIMIT 1
  ) a;

ALTER TABLE task ADD PRIMARY KEY(id);
CREATE INDEX ON task(owner_id, task_date);
CREATE INDEX ON task(author_id);

āĻ†āĻ¸ā§āĻ¨ āĻāĻ•āĻŸāĻŋ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻ¨āĻŋāĻ°ā§āĻŦāĻžāĻšāĻ•ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻļā§‡āĻˇ 100āĻŸāĻŋ āĻ•āĻžāĻœ āĻĻā§‡āĻ–āĻžāĻ‡:

SELECT
  task.*
, person.name
FROM
  task
LEFT JOIN
  person
    ON person.id = task.author_id
WHERE
  owner_id = 777
ORDER BY
  task_date DESC
LIMIT 100;

āĻĒā§‹āĻ¸ā§āĻŸāĻ—ā§āĻ°ā§‡āĻāĻ¸āĻ•āĻŋāĻ‰āĻāĻ˛ āĻ…ā§āĻ¯āĻžāĻ¨ā§āĻŸāĻŋāĻĒā§āĻ¯āĻžāĻŸāĻžāĻ°ā§āĻ¨āĻ¸: āĻ†āĻ¸ā§āĻ¨ āĻāĻ•āĻŸāĻŋ āĻ…āĻ­āĻŋāĻ§āĻžāĻ¨ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ­āĻžāĻ°ā§€ āĻ¯ā§‹āĻ—āĻĻāĻžāĻ¨ āĻ•āĻ°āĻŋ
[explain.tensor.ru āĻĻā§‡āĻ–ā§āĻ¨]

āĻāĻŸāĻž āĻ¯ā§‡ āĻ¸āĻ•ā§āĻ°āĻŋāĻ¯āĻŧ āĻ†āĻ‰āĻŸ 1/3 āĻŽā§‹āĻŸ āĻ¸āĻŽāĻ¯āĻŧ āĻāĻŦāĻ‚ 3/4 āĻ°āĻŋāĻĄāĻŋāĻ‚ āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻ†āĻ‰āĻŸāĻĒā§āĻŸ āĻŸāĻžāĻ¸ā§āĻ•ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻ˛ā§‡āĻ–āĻ•ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ 100 āĻŦāĻžāĻ° āĻ…āĻ¨ā§āĻ¸āĻ¨ā§āĻ§āĻžāĻ¨ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻĄā§‡āĻŸāĻžāĻ° āĻĒā§ƒāĻˇā§āĻ āĻžāĻ—ā§āĻ˛āĻŋ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›āĻŋāĻ˛āĨ¤ āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻ†āĻŽāĻ°āĻž āĻœāĻžāĻ¨āĻŋ āĻāĻ‡ āĻļāĻ¤ āĻļāĻ¤ āĻŽāĻ§ā§āĻ¯ā§‡ āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° 20 āĻ­āĻŋāĻ¨ā§āĻ¨ - āĻāĻ‡ āĻœā§āĻžāĻžāĻ¨ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻ¸āĻŽā§āĻ­āĻŦ?

hstore-āĻ…āĻ­āĻŋāĻ§āĻžāĻ¨

āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻ¯āĻžāĻ• hstore āĻĒā§āĻ°āĻ•āĻžāĻ° āĻāĻ•āĻŸāĻŋ "āĻ…āĻ­āĻŋāĻ§āĻžāĻ¨" āĻ•ā§€-āĻŽāĻžāĻ¨ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻ¤ā§‡:

CREATE EXTENSION hstore

āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻļā§āĻ§ā§ āĻ˛ā§‡āĻ–āĻ•ā§‡āĻ° āĻ†āĻ‡āĻĄāĻŋ āĻāĻŦāĻ‚ āĻ¤āĻžāĻ° āĻ¨āĻžāĻŽ āĻ…āĻ­āĻŋāĻ§āĻžāĻ¨ā§‡ āĻ°āĻžāĻ–āĻ¤ā§‡ āĻšāĻŦā§‡ āĻ¯āĻžāĻ¤ā§‡ āĻ†āĻŽāĻ°āĻž āĻāĻ‡ āĻ•ā§€ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻŦā§‡āĻ° āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°āĻŋ:

-- Ņ„ĐžŅ€ĐŧиŅ€ŅƒĐĩĐŧ Ņ†ĐĩĐģĐĩвŅƒŅŽ вŅ‹ĐąĐžŅ€ĐēŅƒ
WITH T AS (
  SELECT
    *
  FROM
    task
  WHERE
    owner_id = 777
  ORDER BY
    task_date DESC
  LIMIT 100
)
-- Ņ„ĐžŅ€ĐŧиŅ€ŅƒĐĩĐŧ ŅĐģОваŅ€ŅŒ Đ´ĐģŅ ŅƒĐŊиĐēĐ°ĐģŅŒĐŊŅ‹Ņ… СĐŊĐ°Ņ‡ĐĩĐŊиК
, dict AS (
  SELECT
    hstore( -- hstore(keys::text[], values::text[])
      array_agg(id)::text[]
    , array_agg(name)::text[]
    )
  FROM
    person
  WHERE
    id = ANY(ARRAY(
      SELECT DISTINCT
        author_id
      FROM
        T
    ))
)
-- ĐŋĐžĐģŅƒŅ‡Đ°ĐĩĐŧ ŅĐ˛ŅĐˇĐ°ĐŊĐŊŅ‹Đĩ СĐŊĐ°Ņ‡ĐĩĐŊиŅ ŅĐģОваŅ€Ņ
SELECT
  *
, (TABLE dict) -> author_id::text -- hstore -> key
FROM
  T;

āĻĒā§‹āĻ¸ā§āĻŸāĻ—ā§āĻ°ā§‡āĻāĻ¸āĻ•āĻŋāĻ‰āĻāĻ˛ āĻ…ā§āĻ¯āĻžāĻ¨ā§āĻŸāĻŋāĻĒā§āĻ¯āĻžāĻŸāĻžāĻ°ā§āĻ¨āĻ¸: āĻ†āĻ¸ā§āĻ¨ āĻāĻ•āĻŸāĻŋ āĻ…āĻ­āĻŋāĻ§āĻžāĻ¨ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ­āĻžāĻ°ā§€ āĻ¯ā§‹āĻ—āĻĻāĻžāĻ¨ āĻ•āĻ°āĻŋ
[explain.tensor.ru āĻĻā§‡āĻ–ā§āĻ¨]

āĻŦā§āĻ¯āĻ•ā§āĻ¤āĻŋ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•ā§‡ āĻ¤āĻĨā§āĻ¯ āĻĒā§āĻ°āĻžāĻĒā§āĻ¤āĻŋāĻ° āĻœāĻ¨ā§āĻ¯ āĻŦā§āĻ¯āĻ¯āĻŧ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡ 2 āĻ—ā§āĻŖ āĻ•āĻŽ āĻ¸āĻŽāĻ¯āĻŧ āĻāĻŦāĻ‚ 7 āĻ—ā§āĻŖ āĻ•āĻŽ āĻĄā§‡āĻŸāĻž āĻĒāĻĄāĻŧāĻž! "āĻļāĻŦā§āĻĻāĻ­āĻžāĻ¨ā§āĻĄāĻžāĻ°" āĻ›āĻžāĻĄāĻŧāĻžāĻ“, āĻ¯āĻž āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻāĻ‡ āĻĢāĻ˛āĻžāĻĢāĻ˛āĻ—ā§āĻ˛āĻŋ āĻ…āĻ°ā§āĻœāĻ¨ āĻ•āĻ°āĻ¤ā§‡ āĻ¸āĻžāĻšāĻžāĻ¯ā§āĻ¯ āĻ•āĻ°ā§‡āĻ›āĻŋāĻ˛ āĻ¤āĻž āĻšāĻ˛ āĻŦāĻžāĻ˛ā§āĻ• āĻ°ā§‡āĻ•āĻ°ā§āĻĄ āĻĒā§āĻ¨āĻ°ā§āĻĻā§āĻ§āĻžāĻ° āĻŸā§‡āĻŦāĻŋāĻ˛ āĻĨā§‡āĻ•ā§‡ āĻāĻ•āĻŸāĻŋ āĻāĻ•āĻ• āĻĒāĻžāĻ¸ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ = ANY(ARRAY(...)).

āĻ¸āĻžāĻ°āĻŖā§€ āĻāĻ¨ā§āĻŸā§āĻ°āĻŋ: āĻ¸āĻŋāĻ°āĻŋāĻ¯āĻŧāĻžāĻ˛āĻžāĻ‡āĻœā§‡āĻļāĻ¨ āĻāĻŦāĻ‚ āĻĄāĻŋāĻ¸āĻŋāĻ°āĻŋāĻ¯āĻŧāĻžāĻ˛āĻžāĻ‡āĻœā§‡āĻļāĻ¨

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

...
, dict AS (
  SELECT
    hstore(
      array_agg(id)::text[]
    , array_agg(p)::text[] -- ĐŧĐ°ĐŗиŅ #1
    )
  FROM
    person p
  WHERE
    ...
)
SELECT
  *
, (((TABLE dict) -> author_id::text)::person).* -- ĐŧĐ°ĐŗиŅ #2
FROM
  T;

āĻāĻ–āĻžāĻ¨ā§‡ āĻ•āĻŋ āĻ˜āĻŸāĻ›ā§‡ āĻ¤āĻž āĻĻā§‡āĻ–āĻž āĻ¯āĻžāĻ•:

  1. āĻ†āĻŽāĻ°āĻž āĻ¨āĻŋāĻ˛āĻžāĻŽ p āĻĒā§‚āĻ°ā§āĻŖ āĻŦā§āĻ¯āĻ•ā§āĻ¤āĻŋ āĻŸā§‡āĻŦāĻŋāĻ˛ āĻāĻ¨ā§āĻŸā§āĻ°āĻŋāĻ° āĻāĻ•āĻŸāĻŋ āĻ‰āĻĒāĻ¨āĻžāĻŽ āĻšāĻŋāĻ¸āĻžāĻŦā§‡ āĻāĻŦāĻ‚ āĻ¤āĻžāĻĻā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻ…ā§āĻ¯āĻžāĻ°ā§‡ āĻāĻ•āĻ¤ā§āĻ°āĻŋāĻ¤.
  2. āĻāĻ‡ āĻ°ā§‡āĻ•āĻ°ā§āĻĄāĻŋāĻ‚ āĻāĻ° āĻ…ā§āĻ¯āĻžāĻ°ā§‡ recast āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡ āĻŸā§‡āĻ•ā§āĻ¸āĻŸ āĻ¸ā§āĻŸā§āĻ°āĻŋāĻ‚āĻ—ā§āĻ˛āĻŋāĻ° āĻāĻ•āĻŸāĻŋ āĻ…ā§āĻ¯āĻžāĻ°ā§‡āĻ¤ā§‡ (āĻŦā§āĻ¯āĻ•ā§āĻ¤āĻŋ[]::āĻŸā§‡āĻ•ā§āĻ¸āĻŸ[]) āĻāĻŸāĻŋāĻ•ā§‡ hstore āĻ…āĻ­āĻŋāĻ§āĻžāĻ¨ā§‡ āĻŽāĻžāĻ¨āĻ—ā§āĻ˛āĻŋāĻ° āĻāĻ•āĻŸāĻŋ āĻ…ā§āĻ¯āĻžāĻ°ā§‡ āĻšāĻŋāĻ¸āĻžāĻŦā§‡ āĻ°āĻžāĻ–āĻ¤ā§‡āĨ¤
  3. āĻ¯āĻ–āĻ¨ āĻ†āĻŽāĻ°āĻž āĻāĻ•āĻŸāĻŋ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•āĻŋāĻ¤ āĻ°ā§‡āĻ•āĻ°ā§āĻĄ āĻĒāĻžāĻ‡, āĻ†āĻŽāĻ°āĻž āĻ•āĻŋ āĻĻā§āĻŦāĻžāĻ°āĻž āĻ…āĻ­āĻŋāĻ§āĻžāĻ¨ āĻĨā§‡āĻ•ā§‡ āĻŸāĻžāĻ¨āĻž āĻāĻ•āĻŸāĻŋ āĻĒāĻžāĻ ā§āĻ¯ āĻ¸ā§āĻŸā§āĻ°āĻŋāĻ‚ āĻšāĻŋāĻ¸āĻžāĻŦā§‡āĨ¤
  4. āĻ†āĻŽāĻ°āĻž āĻŸā§‡āĻ•ā§āĻ¸āĻŸ āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ āĻāĻ•āĻŸāĻŋ āĻŸā§‡āĻŦāĻŋāĻ˛ āĻŸāĻžāĻ‡āĻĒ āĻŽāĻžāĻ¨ āĻĒāĻ°āĻŋāĻŖāĻ¤ āĻŦā§āĻ¯āĻ•ā§āĻ¤āĻŋ (āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻŸā§‡āĻŦāĻŋāĻ˛ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻ‡ āĻ¨āĻžāĻŽā§‡āĻ° āĻāĻ• āĻĒā§āĻ°āĻ•āĻžāĻ° āĻ¸ā§āĻŦāĻ¯āĻŧāĻ‚āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻ­āĻžāĻŦā§‡ āĻ¤ā§ˆāĻ°āĻŋ āĻšāĻ¯āĻŧ)āĨ¤
  5. āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻ•āĻ˛āĻžāĻŽā§‡ āĻŸāĻžāĻ‡āĻĒ āĻ•āĻ°āĻž āĻ°ā§‡āĻ•āĻ°ā§āĻĄāĻ•ā§‡ "āĻĒā§āĻ°āĻ¸āĻžāĻ°āĻŋāĻ¤ āĻ•āĻ°ā§āĻ¨" (...).*.

json āĻ…āĻ­āĻŋāĻ§āĻžāĻ¨

āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻ†āĻŽāĻ°āĻž āĻ‰āĻĒāĻ°ā§‡ āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻ— āĻ•āĻ°āĻž āĻāĻ‡ āĻ§āĻ°āĻ¨ā§‡āĻ° āĻ•ā§ŒāĻļāĻ˛āĻŸāĻŋ āĻ•āĻžāĻœ āĻ•āĻ°āĻŦā§‡ āĻ¨āĻž āĻ¯āĻĻāĻŋ "āĻ•āĻžāĻ¸ā§āĻŸāĻŋāĻ‚" āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ•ā§‹āĻ¨āĻ“ āĻ¸āĻ‚āĻļā§āĻ˛āĻŋāĻˇā§āĻŸ āĻŸā§‡āĻŦāĻŋāĻ˛ā§‡āĻ° āĻ§āĻ°āĻ¨ āĻ¨āĻž āĻĨāĻžāĻ•ā§‡āĨ¤ āĻ āĻŋāĻ• āĻāĻ•āĻ‡ āĻ…āĻŦāĻ¸ā§āĻĨāĻž āĻ¤ā§ˆāĻ°āĻŋ āĻšāĻŦā§‡, āĻāĻŦāĻ‚ āĻ†āĻŽāĻ°āĻž āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻžāĻ° āĻšā§‡āĻˇā§āĻŸāĻž āĻ¯āĻĻāĻŋ āĻāĻ•āĻŸāĻŋ CTE āĻ¸āĻžāĻ°āĻŋ, āĻāĻ•āĻŸāĻŋ "āĻŦāĻžāĻ¸ā§āĻ¤āĻŦ" āĻŸā§‡āĻŦāĻŋāĻ˛ āĻ¨āĻ¯āĻŧ.

āĻāĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡ āĻ¤āĻžāĻ°āĻž āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ¸āĻžāĻšāĻžāĻ¯ā§āĻ¯ āĻ•āĻ°āĻŦā§‡ json āĻāĻ° āĻ¸āĻžāĻĨā§‡ āĻ•āĻžāĻœ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻĢāĻžāĻ‚āĻļāĻ¨:

...
, p AS ( -- ŅŅ‚Đž ŅƒĐļĐĩ CTE
  SELECT
    *
  FROM
    person
  WHERE
    ...
)
, dict AS (
  SELECT
    json_object( -- Ņ‚ĐĩĐŋĐĩŅ€ŅŒ ŅŅ‚Đž ŅƒĐļĐĩ json
      array_agg(id)::text[]
    , array_agg(row_to_json(p))::text[] -- и вĐŊŅƒŅ‚Ņ€Đ¸ json Đ´ĐģŅ ĐēĐ°ĐļдОК ŅŅ‚Ņ€ĐžĐēи
    )
  FROM
    p
)
SELECT
  *
FROM
  T
, LATERAL(
    SELECT
      *
    FROM
      json_to_record(
        ((TABLE dict) ->> author_id::text)::json -- иСвĐģĐĩĐēĐģи иС ŅĐģОваŅ€Ņ ĐēĐ°Đē json
      ) AS j(name text, birth_date date) -- СаĐŋĐžĐģĐŊиĐģи ĐŊŅƒĐļĐŊŅƒŅŽ ĐŊĐ°Đŧ ŅŅ‚Ņ€ŅƒĐēŅ‚ŅƒŅ€Ņƒ
  ) j;

āĻāĻŸāĻž āĻ˛āĻ•ā§āĻˇ āĻ•āĻ°āĻž āĻ‰āĻšāĻŋāĻ¤ āĻ¯ā§‡ āĻ˛āĻ•ā§āĻˇā§āĻ¯ āĻ•āĻžāĻ āĻžāĻŽā§‹ āĻŦāĻ°ā§āĻŖāĻ¨āĻž āĻ•āĻ°āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ, āĻ†āĻŽāĻ°āĻž āĻ‰āĻ¤ā§āĻ¸ āĻ¸ā§āĻŸā§āĻ°āĻŋāĻ‚ āĻāĻ° āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ° āĻ¤āĻžāĻ˛āĻŋāĻ•āĻžāĻ­ā§āĻ•ā§āĻ¤ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°āĻŋ āĻ¨āĻž, āĻ¤āĻŦā§‡ āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻ¸ā§‡āĻ‡āĻ—ā§āĻ˛āĻŋ āĻ¯āĻž āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ¸āĻ¤ā§āĻ¯āĻŋāĻ‡ āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨āĨ¤ āĻ¯āĻĻāĻŋ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻāĻ•āĻŸāĻŋ "āĻ¨ā§‡āĻŸāĻŋāĻ­" āĻŸā§‡āĻŦāĻŋāĻ˛ āĻĨāĻžāĻ•ā§‡ āĻ¤āĻŦā§‡ āĻĢāĻžāĻ‚āĻļāĻ¨āĻŸāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻ­āĻžāĻ˛ json_populate_record.

āĻ†āĻŽāĻ°āĻž āĻāĻ–āĻ¨āĻ“ āĻ…āĻ­āĻŋāĻ§āĻžāĻ¨ āĻ…ā§āĻ¯āĻžāĻ•ā§āĻ¸ā§‡āĻ¸ āĻāĻ•āĻŦāĻžāĻ°, āĻ•āĻŋāĻ¨ā§āĻ¤ā§ json-[de] āĻ¸āĻŋāĻ°āĻŋāĻ¯āĻŧāĻžāĻ˛āĻžāĻ‡āĻœā§‡āĻļāĻ¨ āĻ–āĻ°āĻš āĻŦā§‡āĻļ āĻŦā§‡āĻļāĻŋāĻ¤āĻžāĻ‡, āĻāĻ‡ āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻŸāĻŋ āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻ•āĻŋāĻ›ā§ āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻ¯ā§āĻ•ā§āĻ¤āĻŋāĻ¸āĻ™ā§āĻ—āĻ¤ āĻ¯āĻ–āĻ¨ "āĻ¸ā§Ž" CTE āĻ¸ā§āĻ•ā§āĻ¯āĻžāĻ¨ āĻ¨āĻŋāĻœā§‡āĻ•ā§‡ āĻ†āĻ°āĻ“ āĻ–āĻžāĻ°āĻžāĻĒ āĻĻā§‡āĻ–āĻžāĻ¯āĻŧāĨ¤

āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°ā§āĻŽāĻ•ā§āĻˇāĻŽāĻ¤āĻž

āĻ¸ā§āĻ¤āĻ°āĻžāĻ‚, āĻ†āĻŽāĻ°āĻž āĻāĻ•āĻŸāĻŋ āĻ…āĻ­āĻŋāĻ§āĻžāĻ¨ā§‡ āĻĄā§‡āĻŸāĻž āĻ¸āĻŋāĻ°āĻŋāĻ¯āĻŧāĻžāĻ˛āĻžāĻ‡āĻœ āĻ•āĻ°āĻžāĻ° āĻĻā§āĻŸāĻŋ āĻ‰āĻĒāĻžāĻ¯āĻŧ āĻĒā§‡āĻ¯āĻŧā§‡āĻ›āĻŋ - hstore/json_object. āĻāĻ›āĻžāĻĄāĻŧāĻžāĻ“, āĻ•ā§€ āĻāĻŦāĻ‚ āĻŽāĻžāĻ¨āĻ—ā§āĻ˛āĻŋāĻ° āĻ…ā§āĻ¯āĻžāĻ°ā§‡āĻ—ā§āĻ˛āĻŋāĻ“ āĻĻā§āĻŸāĻŋ āĻ‰āĻĒāĻžāĻ¯āĻŧā§‡ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡, āĻĒāĻžāĻ ā§āĻ¯ā§‡ āĻ…āĻ­ā§āĻ¯āĻ¨ā§āĻ¤āĻ°ā§€āĻŖ āĻŦāĻž āĻŦāĻžāĻšā§āĻ¯āĻŋāĻ• āĻ°ā§‚āĻĒāĻžāĻ¨ā§āĻ¤āĻ° āĻ¸āĻš: array_agg(i::text) / array_agg(i)::text[].

āĻ†āĻ¸ā§āĻ¨ āĻāĻ•āĻŸāĻŋ āĻŦāĻŋāĻļā§āĻĻā§āĻ§āĻ­āĻžāĻŦā§‡ āĻ•ā§ƒāĻ¤ā§āĻ°āĻŋāĻŽ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āĻ¨ āĻ§āĻ°āĻŖā§‡āĻ° āĻ¸āĻŋāĻ°āĻŋāĻ¯āĻŧāĻžāĻ˛āĻžāĻ‡āĻœā§‡āĻļāĻ¨ā§‡āĻ° āĻ•āĻžāĻ°ā§āĻ¯āĻ•āĻžāĻ°āĻŋāĻ¤āĻž āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻŋ - āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āĻ¨ āĻ¸āĻ‚āĻ–ā§āĻ¯āĻžāĻ° āĻ•ā§€ āĻ•ā§āĻ°āĻŽāĻŋāĻ• āĻ•āĻ°āĻž:

WITH dict AS (
  SELECT
    hstore(
      array_agg(i::text)
    , array_agg(i::text)
    )
  FROM
    generate_series(1, ...) i
)
TABLE dict;

āĻŽā§‚āĻ˛ā§āĻ¯āĻžāĻ¯āĻŧāĻ¨ āĻ¸ā§āĻ•ā§āĻ°āĻŋāĻĒā§āĻŸ: āĻ•ā§āĻ°āĻŽāĻŋāĻ•āĻ•āĻ°āĻŖ

WITH T AS (
  SELECT
    *
  , (
      SELECT
        regexp_replace(ea[array_length(ea, 1)], '^Execution Time: (d+.d+) ms$', '1')::real et
      FROM
        (
          SELECT
            array_agg(el) ea
          FROM
            dblink('port= ' || current_setting('port') || ' dbname=' || current_database(), $$
              explain analyze
              WITH dict AS (
                SELECT
                  hstore(
                    array_agg(i::text)
                  , array_agg(i::text)
                  )
                FROM
                  generate_series(1, $$ || (1 << v) || $$) i
              )
              TABLE dict
            $$) T(el text)
        ) T
    ) et
  FROM
    generate_series(0, 19) v
  ,   LATERAL generate_series(1, 7) i
  ORDER BY
    1, 2
)
SELECT
  v
, avg(et)::numeric(32,3)
FROM
  T
GROUP BY
  1
ORDER BY
  1;

āĻĒā§‹āĻ¸ā§āĻŸāĻ—ā§āĻ°ā§‡āĻāĻ¸āĻ•āĻŋāĻ‰āĻāĻ˛ āĻ…ā§āĻ¯āĻžāĻ¨ā§āĻŸāĻŋāĻĒā§āĻ¯āĻžāĻŸāĻžāĻ°ā§āĻ¨āĻ¸: āĻ†āĻ¸ā§āĻ¨ āĻāĻ•āĻŸāĻŋ āĻ…āĻ­āĻŋāĻ§āĻžāĻ¨ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ­āĻžāĻ°ā§€ āĻ¯ā§‹āĻ—āĻĻāĻžāĻ¨ āĻ•āĻ°āĻŋ

PostgreSQL 11-āĻ, āĻĒā§āĻ°āĻžāĻ¯āĻŧ 2^12 āĻ•ā§€āĻ—ā§āĻ˛āĻŋāĻ° āĻ…āĻ­āĻŋāĻ§āĻžāĻ¨ āĻ†āĻ•āĻžāĻ° āĻĒāĻ°ā§āĻ¯āĻ¨ā§āĻ¤ json-āĻ āĻ¸āĻŋāĻ°āĻŋāĻ¯āĻŧāĻžāĻ˛āĻžāĻ‡āĻœā§‡āĻļāĻ¨ āĻ•āĻŽ āĻ¸āĻŽāĻ¯āĻŧ āĻ¨ā§‡āĻ¯āĻŧ. āĻāĻ‡ āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡, āĻ¸āĻŦāĻšā§‡āĻ¯āĻŧā§‡ āĻ•āĻžāĻ°ā§āĻ¯āĻ•āĻ° āĻšāĻ˛ json_object āĻāĻŦāĻ‚ "āĻ…āĻ­ā§āĻ¯āĻ¨ā§āĻ¤āĻ°ā§€āĻŖ" āĻŸāĻžāĻ‡āĻĒ āĻ°ā§‚āĻĒāĻžāĻ¨ā§āĻ¤āĻ°ā§‡āĻ° āĻ¸āĻ‚āĻŽāĻŋāĻļā§āĻ°āĻŖ array_agg(i::text).

āĻāĻ–āĻ¨ āĻ†āĻ¸ā§āĻ¨ āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻ•ā§€āĻ° āĻŽāĻžāĻ¨ 8 āĻŦāĻžāĻ° āĻĒāĻĄāĻŧāĻžāĻ° āĻšā§‡āĻˇā§āĻŸāĻž āĻ•āĻ°āĻŋ - āĻ¸āĻ°ā§āĻŦā§‹āĻĒāĻ°āĻŋ, āĻ†āĻĒāĻ¨āĻŋ āĻ¯āĻĻāĻŋ āĻ…āĻ­āĻŋāĻ§āĻžāĻ¨āĻŸāĻŋ āĻ…ā§āĻ¯āĻžāĻ•ā§āĻ¸ā§‡āĻ¸ āĻ¨āĻž āĻ•āĻ°ā§‡āĻ¨, āĻ¤āĻŦā§‡ āĻāĻŸāĻŋāĻ° āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ āĻ•ā§‡āĻ¨?

āĻŽā§‚āĻ˛ā§āĻ¯āĻžāĻ¯āĻŧāĻ¨ āĻ¸ā§āĻ•ā§āĻ°āĻŋāĻĒā§āĻŸ: āĻāĻ•āĻŸāĻŋ āĻ…āĻ­āĻŋāĻ§āĻžāĻ¨ āĻĨā§‡āĻ•ā§‡ āĻĒāĻĄāĻŧāĻž

WITH T AS (
  SELECT
    *
  , (
      SELECT
        regexp_replace(ea[array_length(ea, 1)], '^Execution Time: (d+.d+) ms$', '1')::real et
      FROM
        (
          SELECT
            array_agg(el) ea
          FROM
            dblink('port= ' || current_setting('port') || ' dbname=' || current_database(), $$
              explain analyze
              WITH dict AS (
                SELECT
                  json_object(
                    array_agg(i::text)
                  , array_agg(i::text)
                  )
                FROM
                  generate_series(1, $$ || (1 << v) || $$) i
              )
              SELECT
                (TABLE dict) -> (i % ($$ || (1 << v) || $$) + 1)::text
              FROM
                generate_series(1, $$ || (1 << (v + 3)) || $$) i
            $$) T(el text)
        ) T
    ) et
  FROM
    generate_series(0, 19) v
  , LATERAL generate_series(1, 7) i
  ORDER BY
    1, 2
)
SELECT
  v
, avg(et)::numeric(32,3)
FROM
  T
GROUP BY
  1
ORDER BY
  1;

āĻĒā§‹āĻ¸ā§āĻŸāĻ—ā§āĻ°ā§‡āĻāĻ¸āĻ•āĻŋāĻ‰āĻāĻ˛ āĻ…ā§āĻ¯āĻžāĻ¨ā§āĻŸāĻŋāĻĒā§āĻ¯āĻžāĻŸāĻžāĻ°ā§āĻ¨āĻ¸: āĻ†āĻ¸ā§āĻ¨ āĻāĻ•āĻŸāĻŋ āĻ…āĻ­āĻŋāĻ§āĻžāĻ¨ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ­āĻžāĻ°ā§€ āĻ¯ā§‹āĻ—āĻĻāĻžāĻ¨ āĻ•āĻ°āĻŋ

āĻāĻŦāĻ‚... āĻ‡āĻ¤āĻŋāĻŽāĻ§ā§āĻ¯ā§‡ āĻĒā§āĻ°āĻžāĻ¯āĻŧ 2^6 āĻ•ā§€ āĻ¸āĻš, āĻāĻ•āĻŸāĻŋ json āĻ…āĻ­āĻŋāĻ§āĻžāĻ¨ āĻĨā§‡āĻ•ā§‡ āĻĒāĻĄāĻŧāĻž āĻāĻ•āĻžāĻ§āĻŋāĻ•āĻŦāĻžāĻ° āĻšāĻžāĻ°āĻžāĻ¤ā§‡ āĻļā§āĻ°ā§ āĻ•āĻ°ā§‡ hstore āĻĨā§‡āĻ•ā§‡ āĻĒāĻĄāĻŧāĻž, jsonb āĻāĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻ‡ 2^9 āĻ āĻ˜āĻŸā§‡āĨ¤

āĻšā§‚āĻĄāĻŧāĻžāĻ¨ā§āĻ¤ āĻ¸āĻŋāĻĻā§āĻ§āĻžāĻ¨ā§āĻ¤:

  • āĻ†āĻĒāĻ¨āĻŋ āĻāĻŸāĻž āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡ āĻāĻ•āĻžāĻ§āĻŋāĻ• āĻĒā§āĻ¨āĻ°āĻžāĻŦā§ƒāĻ¤ā§āĻ¤āĻŋ āĻ°ā§‡āĻ•āĻ°ā§āĻĄā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ¯ā§‹āĻ— āĻĻāĻŋāĻ¨ - āĻŸā§‡āĻŦāĻŋāĻ˛ā§‡āĻ° "āĻ…āĻ­āĻŋāĻ§āĻžāĻ¨" āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻ­āĻžāĻ˛
  • āĻ¯āĻĻāĻŋ āĻ†āĻĒāĻ¨āĻžāĻ° āĻ…āĻ­āĻŋāĻ§āĻžāĻ¨ āĻĒā§āĻ°āĻ¤ā§āĻ¯āĻžāĻļāĻŋāĻ¤ āĻšāĻ¯āĻŧ āĻ›ā§‹āĻŸ āĻāĻŦāĻ‚ āĻ†āĻĒāĻ¨āĻŋ āĻāĻŸāĻŋ āĻĨā§‡āĻ•ā§‡ āĻ…āĻ¨ā§‡āĻ• āĻĒāĻĄāĻŧāĻŦā§‡āĻ¨ āĻ¨āĻž - āĻ†āĻĒāĻ¨āĻŋ json [b] āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨
  • āĻ…āĻ¨ā§āĻ¯ āĻ¸āĻŦ āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡ hstore + array_agg(i::text) āĻ†āĻ°ā§‹ āĻ•āĻžāĻ°ā§āĻ¯āĻ•āĻ° āĻšāĻŦā§‡

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

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