เจ เจธเฉเจ "เจชเฉเจฐเจคเฉเจค เจคเฉเจฐ 'เจคเฉ เจธเจงเจพเจฐเจจ" PostgreSQL เจธเจตเจพเจฒเจพเจ เจฆเฉ เจชเฉเจฐเจฆเจฐเจธเจผเจจ เจจเฉเฉฐ เจฌเจฟเจนเจคเจฐ เจฌเจฃเจพเจเจฃ เจฒเจ เจฌเจนเฉเจค เจเฉฑเจ เจเจพเจฃเฉ-เจชเจเจพเจฃเฉ เจคเจฐเฉเจเจฟเจเจ เจฆเฉ เจ เจงเจฟเจเจจ เจฒเจ เจธเจฎเจฐเจชเจฟเจค เจฒเฉเจเจพเจ เจฆเฉ เจฒเฉเฉ เจจเฉเฉฐ เจเจพเจฐเฉ เจฐเฉฑเจเจฆเฉ เจนเจพเจ:
เจเจน เจจเจพ เจธเฉเจเฉ เจเจฟ เจฎเฉเจจเฉเฉฐ เจธเจผเจพเจฎเจฒ เจนเฉเจฃเจพ เจฌเจนเฉเจค เจชเจธเฉฐเจฆ เจจเจนเฉเจ เจนเฉ... :)
เจชเจฐ เจ เจเจธเจฐ เจเจธเจฆเฉ เจฌเจฟเจจเจพเจ, เจฌเฉเจจเจคเฉ เจเจธเจฆเฉ เจจเจพเจฒ เจจเจพเจฒเฉเจ เจเจพเจซเจผเฉ เจเจผเจฟเจเจฆเจพ เจฒเจพเจญเจเจพเจฐเฉ เจธเจพเจฌเจค เจนเฉเฉฐเจฆเฉ เจนเฉ. เจเจธ เจฒเจ เจ เฉฑเจ เจ เจธเฉเจ เจเฉเจธเจผเจฟเจธเจผ เจเจฐเจพเจเจเฉ เจธเจฐเฉเจค-เจธเฉฐเจฌเฉฐเจงเฉ เจธเจผเจพเจฎเจฒ เจนเฉเจฃ เจคเฉเจ เจเฉเจเจเจพเจฐเจพ เจชเจพเจ - เจเฉฑเจ เจธเจผเจฌเจฆเจเฉเจธเจผ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจฆเฉ เจนเฉเจ.

PostgreSQL 12 เจจเจพเจฒ เจธเจผเฉเจฐเฉ เจเจฐเจฆเฉ เจนเฉเจ, เจนเฉเจ เจพเจ เจฆเฉฑเจธเฉเจเจ เจเจเจเจ เจเฉเจ เจธเจฅเจฟเจคเฉเจเจ เจฆเฉ เจเจพเจฐเจจ เจฅเฉเฉเฉเจนเฉ เจตเฉฑเจเจฐเฉ เจคเฉเจฐ 'เจคเฉ เจฆเฉเจฌเจพเจฐเจพ เจคเจฟเจเจฐ เจเฉเจคเจพ เจเจพ เจธเจเจฆเจพ เจนเฉ . เจเจธ เจตเจฟเจตเจนเจพเจฐ เจจเฉเฉฐ เจเฉเฉฐเจเฉ เจฆเฉ เจเฉ เจตเจพเจชเจธ เจฒเจฟเจ เจเจพ เจธเจเจฆเจพ เจนเฉ
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; 
เจเจน เจชเจคเจพ เจเจฒเจฆเจพ เจนเฉ เจเจฟ 1/3 เจเฉเฉฑเจฒ เจธเจฎเจพเจ เจ เจคเฉ 3/4 เจฐเฉเจกเจฟเฉฐเจ เจกเฉเจเจพ เจฆเฉ เจชเฉฐเจจเจฟเจเจ เจจเฉเฉฐ เจฒเฉเจเจ เจฆเฉ เจเฉเจ เจเจฐเจจ เจฒเจ 100 เจตเจพเจฐ เจฌเจฃเจพเจเจ เจเจฟเจ เจธเฉ - เจนเจฐเฉเจ เจเจเจเจชเฉเฉฑเจ เจเจพเจฐเจ เจฒเจเฅค เจชเจฐ เจ เจธเฉเจ เจเจพเจฃเจฆเฉ เจนเจพเจ เจเจฟ เจเจนเจจเจพเจ เจธเฉเจเจเฉเฉ เจตเจฟเฉฑเจเฉเจ เจธเจฟเจฐเจซ 20 เจตเฉฑเจเจฐเฉ - เจเฉ เจเจธ เจเจฟเจเจจ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจจเจพ เจธเฉฐเจญเจต เจนเฉ?
hstore-เจเฉเจธเจผ
เจเจ เจฒเจพเจญ เจเจ เจพเจเจ เจเฉฑเจ "เจกเจเจธเจผเจจเจฐเฉ" เจเฉเฉฐเจเฉ-เจฎเฉเฉฑเจฒ เจฌเจฃเจพเจเจฃ เจฒเจ:
CREATE EXTENSION hstoreเจธเจพเจจเฉเฉฐ เจฒเฉเจเจ เจฆเฉ ID เจ เจคเฉ เจเจธเจฆเจพ เจจเจพเจฎ เจธเจผเจฌเจฆเจเฉเจธเจผ เจตเจฟเฉฑเจ เจชเจพเจเจฃ เจฆเฉ เจฒเฉเฉ เจนเฉ เจคเจพเจ เจเฉ เจ เจธเฉเจ เจซเจฟเจฐ เจเจธ เจเฉเฉฐเจเฉ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจเฉ เจเจเจธเจเจฐเฉเจเจ เจเจฐ เจธเจเฉเจ:
-- ัะพัะผะธััะตะผ ัะตะปะตะฒัั ะฒัะฑะพัะบั
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; 
เจตเจฟเจ
เจเจคเฉเจเจ เจฌเจพเจฐเฉ เจเจพเจฃเจเจพเจฐเฉ เจชเฉเจฐเจพเจชเจค เจเจฐเจจ 'เจคเฉ เจเจฐเจ เจเฉเจคเจพ เจเจฟเจ 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;เจเจ เจฆเฉเจเฉเจ เจเจฟ เจเฉฑเจฅเฉ เจเฉ เจนเฉ เจฐเจฟเจนเจพ เจธเฉ:
- เจ เจธเฉเจ เจฒเจฟเจ p เจชเฉเจฐเฉ เจตเจฟเจ เจเจคเฉ เจเฉเจฌเจฒ เจเจเจเจฐเฉ เจฒเจ เจเจชเจจเจพเจฎ เจตเจเฉเจ เจ เจคเฉ เจเจนเจจเจพเจ เจฆเฉ เจเฉฑเจ เจฒเฉเฉ เจจเฉเฉฐ เจเจเฉฑเจ เจพ เจเฉเจคเจพเฅค
- เจเจธ เจฐเจฟเจเจพเจฐเจกเจฟเฉฐเจเจพเจ เจฆเฉ เจฒเฉเฉ เจจเฉเฉฐ เจฆเฉเจฌเจพเจฐเจพ เจฌเจฃเจพเจเจ เจเจฟเจ เจธเฉ เจเจธ เจจเฉเฉฐ hstore เจกเจฟเจเจธเจผเจจเจฐเฉ เจตเจฟเฉฑเจ เจฎเฉเฉฑเจฒเจพเจ เจฆเฉ เจเฉฑเจ เจเจฐเฉ เจตเจเฉเจ เจฐเฉฑเจเจฃ เจฒเจ เจเฉเจเจธเจ เจธเจคเจฐเจพเจ เจฆเฉ เจเฉฑเจ เจเจฐเฉ (person[]::text[]) เจตเจฟเฉฑเจเฅค
- เจเจฆเฉเจ เจ เจธเฉเจ เจเฉฑเจ เจธเฉฐเจฌเฉฐเจงเจฟเจค เจฐเจฟเจเจพเจฐเจก เจชเฉเจฐเจพเจชเจค เจเจฐเจฆเฉ เจนเจพเจ, เจ เจธเฉเจ เจเฉเฉฐเจเฉ เจฆเฉเจเจฐเจพ เจธเจผเจฌเจฆเจเฉเจธเจผ เจตเจฟเฉฑเจเฉเจ เจเจฟเฉฑเจเจฟเจ เจเจฟเจ เจเฉฑเจ เจเฉเจเจธเจ เจธเจคเจฐ เจฆเฉ เจฐเฉเจช เจตเจฟเฉฑเจ.
- เจธเจพเจจเฉเฉฐ เจเฉเจเจธเจ เจฆเฉ เจฒเฉเฉ เจนเฉ เจเฉฑเจ เจธเจพเจฐเจฃเฉ เจเจฟเจธเจฎ เจฆเฉ เจฎเฉเฉฑเจฒ เจตเจฟเฉฑเจ เจฌเจฆเจฒเฉ เจตเจฟเจ เจเจคเฉ (เจนเจฐเฉเจ เจเฉเจฌเจฒ เจฒเจ เจเฉฑเจเฉ เจจเจพเจฎ เจฆเฉ เจเฉฑเจ เจเจฟเจธเจฎ เจเจชเจฃเฉ เจเจช เจฌเจฃ เจเจพเจเจฆเฉ เจนเฉ)เฅค
- เจเจพเจเจช เจเฉเจคเฉ เจฐเจฟเจเจพเจฐเจก เจจเฉเฉฐ เจเจพเจฒเจฎเจพเจ เจตเจฟเฉฑเจ เจตเจฐเจคเจฆเฉ เจนเฉเจ "เจตเจฟเจธเจคเจพเจฐ เจเจฐเฉ"
(...).*.
json เจธเจผเจฌเจฆเจเฉเจธเจผ
เจชเจฐ เจ เจเจฟเจนเฉ เจเจพเจฒ เจเจฟเจตเฉเจ เจ เจธเฉเจ เจเฉฑเจชเจฐ เจฒเจพเจเฉ เจเฉเจคเฉ เจนเฉ เจเฉฐเจฎ เจจเจนเฉเจ เจเจฐเฉเจเฉ เจเฉเจเจฐ "เจเจพเจธเจเจฟเฉฐเจ" เจเจฐเจจ เจฒเจ เจเฉเจ เจ เจจเฉเจธเจพเจฐเฉ เจเฉเจฌเจฒ เจเจฟเจธเจฎ เจจเจนเฉเจ เจนเฉเฅค เจฌเจฟเจฒเจเฉเจฒ เจเจนเฉ เจธเจฅเจฟเจคเฉ เจชเฉเจฆเจพ เจนเฉเจตเฉเจเฉ, เจ เจคเฉ เจเฉ เจ เจธเฉเจ เจตเจฐเจคเจฃ เจฆเฉ เจเฉเจธเจผเจฟเจธเจผ เจเจฐเฉเจ เจเฉฑเจ CTE เจเจคเจพเจฐ, เจเฉฑเจ "เจ เจธเจฒ" เจธเจพเจฐเจฃเฉ เจจเจนเฉเจ.
เจเจธ เจฎเจพเจฎเจฒเฉ เจตเจฟเฉฑเจ เจเจน เจธเจพเจกเฉ เจฎเจฆเจฆ เจเจฐเจจเจเฉ :
...
, 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_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 เจเฉเฉฐเจเฉเจเจ เจจเจพเจฒ, เจเฉเจธเจจ เจกเจฟเจเจธเจผเจจเจฐเฉ เจคเฉเจ เจชเฉเฉเจนเจจเจพ เจเจ เจตเจพเจฐ เจเฉเจเจเจฃเจพ เจธเจผเฉเจฐเฉ เจนเฉ เจเจพเจเจฆเจพ เจนเฉ hstore เจคเฉเจ เจชเฉเฉเจนเจจเจพ, jsonb เจฒเจ เจเจนเฉ 2^9 'เจคเฉ เจนเฉเฉฐเจฆเจพ เจนเฉเฅค
เจ เฉฐเจคเจฎ เจธเจฟเฉฑเจเฉ:
- เจเฉเจเจฐ เจคเฉเจนเจพเจจเฉเฉฐ เจเจน เจเจฐเจจ เจฆเฉ เจฒเฉเฉ เจนเฉ เจเจ เจฆเฉเจนเจฐเจพเจเจฃ เจตเจพเจฒเฉ เจฐเจฟเจเจพเจฐเจกเจพเจ เจจเจพเจฒ เจเฉเฉเฉ - เจธเจพเจฐเจฃเฉ เจฆเฉ "เจกเจเจธเจผเจจเจฐเฉ" เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจจเจพ เจฌเจฟเจนเจคเจฐ เจนเฉ
- เจเฉเจเจฐ เจคเฉเจนเจพเจกเฉ เจธเจผเจฌเจฆเจเฉเจธเจผ เจฆเฉ เจเจฎเฉเจฆ เจเฉเจคเฉ เจเจพเจเจฆเฉ เจนเฉ เจเฉเจเจพ เจนเฉ เจ เจคเฉ เจคเฉเจธเฉเจ เจเจธ เจคเฉเจ เจเจผเจฟเจเจฆเจพ เจจเจนเฉเจ เจชเฉเฉเจนเฉเจเฉ - เจคเฉเจธเฉเจ json [b] เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐ เจธเจเจฆเฉ เจนเฉ
- เจนเฉเจฐ เจธเจพเจฐเฉ เจฎเจพเจฎเจฒเจฟเจเจ เจตเจฟเฉฑเจ hstore + array_agg(i::text) เจตเจงเฉเจฐเฉ เจชเฉเจฐเจญเจพเจตเจธเจผเจพเจฒเฉ เจนเฉเจตเฉเจเจพ
เจธเจฐเฉเจค: www.habr.com
