เจฎเฉเจฐเฉ เจเฉฐเจฎ เจฆเฉ เจฒเจพเจเจจ เจฆเฉ เจเจพเจฐเจจ, เจฎเฉเจจเฉเฉฐ เจเจนเจจเจพเจ เจธเจฅเจฟเจคเฉเจเจ เจจเจพเจฒ เจจเจเจฟเฉฑเจ เจฃเจพ เจชเฉเจเจฆเจพ เจนเฉ เจเจฆเฉเจ เจเฉฑเจ เจกเจฟเจตเฉเจฒเจชเจฐ เจเฉฑเจ เจฌเฉเจจเจคเฉ เจฒเจฟเจเจฆเจพ เจนเฉ เจ เจคเฉ เจธเฉเจเจฆเจพ เจนเฉ "เจ เจงเจพเจฐ เจเฉเจธเจค เจนเฉ, เจเจน เจธเจญ เจเฉเจ เจเจชเจฃเฉ เจเจช เจธเฉฐเจญเจพเจฒ เจธเจเจฆเจพ เจนเฉ!ยซ
เจเฉเจ เจฎเจพเจฎเจฒเจฟเจเจ เจตเจฟเฉฑเจ (เจ
เฉฐเจธเจผเจ เจคเฉเจฐ 'เจคเฉ เจกเฉเจเจพเจฌเฉเจธ เจฆเฉเจเจ เจธเจฎเจฐเฉฑเจฅเจพเจตเจพเจ เจฆเฉ เจ
เจเจฟเจเจจเจคเจพ เจคเฉเจ, เจ
เฉฐเจธเจผเจ เจคเฉเจฐ 'เจคเฉ เจธเจฎเฉเจ เจคเฉเจ เจชเจนเจฟเจฒเจพเจ เจ
เจจเฉเจเฉเจฒเจคเจพเจตเจพเจ เจคเฉเจ), เจเจน เจชเจนเฉเฉฐเจ "เจซเฉเจฐเฉเจเจเจจเจธเจเจพเจเจจเจเจผ" เจฆเฉ เจฆเจฟเฉฑเจ เจตเฉฑเจฒ เจฒเฉ เจเจพเจเจฆเฉ เจนเฉเฅค
เจชเจนเจฟเจฒเจพเจ, เจฎเฉเจ เจ
เจเจฟเจนเฉ เจฌเฉเจจเจคเฉ เจฆเฉ เจเฉฑเจ เจเจฆเจพเจนเจฐเจฃ เจฆเฉเจตเจพเจเจเจพ:
-- ะดะปั ะบะฐะถะดะพะน ะบะปััะตะฒะพะน ะฟะฐัั ะฝะฐั
ะพะดะธะผ ะฐััะพัะธะธัะพะฒะฐะฝะฝัะต ะทะฝะฐัะตะฝะธั ะฟะพะปะตะน
WITH RECURSIVE cte_bind AS (
SELECT DISTINCT ON (key_a, key_b)
key_a a
, key_b b
, fld1 bind_fld1
, fld2 bind_fld2
FROM
tbl
)
-- ะฝะฐั
ะพะดะธะผ min/max ะทะฝะฐัะตะฝะธะน ะดะปั ะบะฐะถะดะพะณะพ ะฟะตัะฒะพะณะพ ะบะปััะฐ
, cte_max AS (
SELECT
a
, max(bind_fld1) bind_fld1
, min(bind_fld2) bind_fld2
FROM
cte_bind
GROUP BY
a
)
-- ัะฒัะทัะฒะฐะตะผ ะฟะพ ะฟะตัะฒะพะผั ะบะปััั ะบะปััะตะฒัะต ะฟะฐัั ะธ min/max-ะทะฝะฐัะตะฝะธั
, cte_a_bind AS (
SELECT
cte_bind.a
, cte_bind.b
, cte_max.bind_fld1
, cte_max.bind_fld2
FROM
cte_bind
INNER JOIN
cte_max
ON cte_max.a = cte_bind.a
)
SELECT * FROM cte_a_bind;
เจเจฟเจธเฉ เจฌเฉเจจเจคเฉ เจฆเฉ เจเฉเจฃเจตเฉฑเจคเจพ เจฆเจพ เจ เจธเจฒ เจฎเฉเจฒเจพเจเจเจฃ เจเจฐเจจ เจฒเจ, เจเจ เจเฉเจ เจฎเจจเจฎเจพเจจเฉ เจกเฉเจเจพ เจธเฉเจ เจฌเจฃเจพเจเจ:
CREATE TABLE tbl AS
SELECT
(random() * 1000)::integer key_a
, (random() * 1000)::integer key_b
, (random() * 10000)::integer fld1
, (random() * 10000)::integer fld2
FROM
generate_series(1, 10000);
CREATE INDEX ON tbl(key_a, key_b);
เจเจน เจชเจคเจพ เจเจฒเจฆเจพ เจนเฉ เจเจฟ เจกเฉเจเจพ เจจเฉเฉฐ เจชเฉเฉเจนเจจ เจตเจฟเฉฑเจ เจเฉฑเจ เจเฉเจฅเจพเจ เจคเฉเจ เจตเฉ เจเฉฑเจ เจธเจฎเจพเจ เจฒเฉฑเจเจฟเจ เจชเฉเฉฑเจเจเจฟเฉฑเจ เจเจเจเจผเฉเจเจฟเจเจธเจผเจจ:
เจเฉเจเฉเฉ-เจเฉเจเฉเฉ เจเจฐเจเฉ เจเจธ เจจเฉเฉฐ เจตเฉฑเจเจฐเจพ เจเจฐเจจเจพ
เจเจ เจฌเฉเจจเจคเฉ 'เจคเฉ เจเฉฑเจ เจกเฉเฉฐเจเจพเจ เจจเจพเจฒ เจตเจฟเจเจพเจฐ เจเจฐเฉเจ เจ เจคเฉ เจเจฒเจเจฃ เจตเจฟเฉฑเจ เจฐเจนเฉ:
- เจเฉเจเจฐ เจเฉเจ เจเจตเจฐเจคเฉ CTE เจจเจนเฉเจ เจนเจจ เจคเจพเจ เจเฉฑเจฅเฉ WITH RECURSIVE เจเจฟเจเจ เจนเฉ?
- เจเฉฑเจ เจตเฉฑเจเจฐเฉ CTE เจตเจฟเฉฑเจ เจธเจฎเฉเจน เจเฉฑเจเฉ-เจเฉฑเจ/เจ
เจงเจฟเจเจคเจฎ เจฎเฉเฉฑเจฒ เจเจฟเจเจ เจนเจจ เจเฉเจเจฐ เจเจน เจซเจฟเจฐ เจตเฉ เจฎเฉเจฒ เจจเจฎเฉเจจเฉ เจจเจพเจฒ เจฌเฉฐเจจเฉเจนเฉ เจนเฉเจ เจนเจจ?
+25% เจธเจฎเจพเจ - เจชเจฟเจเจฒเฉ CTE เจจเฉเฉฐ เจฆเฉเจนเจฐเจพเจเจฃ เจฒเจ เจ
เฉฐเจค เจตเจฟเฉฑเจ เจฌเจฟเจจเจพเจ เจธเจผเจฐเจค 'SELECT * FROM' เจฆเฉ เจตเจฐเจคเฉเจ เจเจฟเจเจ เจเจฐเฉเจ?
+14% เจธเจฎเจพเจ
เจเจธ เจฎเจพเจฎเจฒเฉ เจตเจฟเฉฑเจ, เจ เจธเฉเจ เจฌเจนเฉเจค เจเฉเจธเจผเจเจฟเจธเจฎเจค เจธเฉ เจเจฟ เจเจจเฉเจเจธเจผเจจ เจฒเจ Hash Join เจจเฉเฉฐ เจเฉเจฃเจฟเจ เจเจฟเจ เจธเฉ, เจจเจพ เจเจฟ Nested Loop, เจเจฟเจเจเจเจฟ เจเจฆเฉเจ เจธเจพเจจเฉเฉฐ เจธเจฟเจฐเจซเจผ เจเฉฑเจ CTE เจธเจเฉเจจ เจชเจพเจธ เจจเจนเฉเจ, เจธเจเฉเจ 10K เจชเฉเจฐเจพเจชเจค เจนเฉเจ เจนเฉเจฃเจเฉ!
เจธเฉเจเฉเจ เจธเจเฉเจจ เจฌเจพเจฐเฉ เจฅเฉเฉเฉเจนเจพ เจเจฟเจนเจพเจเฉฑเจฅเฉ เจธเจพเจจเฉเฉฐ เจเจน เจฏเจพเจฆ เจฐเฉฑเจเจฃเจพ เจเจพเจนเฉเจฆเจพ เจนเฉ CTE เจธเจเฉเจจ Seq เจธเจเฉเจจ เจฆเฉ เจธเจฎเจพเจจ เจนเฉ - เจญเจพเจต, เจเฉเจ เจเฉฐเจกเฉเจเจธเจฟเฉฐเจ เจจเจนเฉเจ, เจชเจฐ เจธเจฟเจฐเจซ เจเฉฑเจ เจชเฉเจฐเฉ เจเฉเจ, เจเจฟเจธเจฆเฉ เจฒเฉเฉ เจนเฉเจตเฉเจเฉ 10K x 0.3ms = 3000ms cte_max เจฆเฉเจเจฐเจพ เจเฉฑเจเจฐ เจฒเจ เจ 1K x 1.5ms = 1500ms เจเจฆเฉเจ cte_bind เจฆเฉเจเจฐเจพ เจฒเฉเจช เจเฉเจคเจพ เจเจพเจเจฆเจพ เจนเฉ!
เจ
เจธเจฒ เจตเจฟเฉฑเจ, เจคเฉเจธเฉเจ เจจเจคเฉเจเฉ เจตเจเฉเจ เจเฉ เจชเฉเจฐเจพเจชเจค เจเจฐเจจเจพ เจเจพเจนเฉเฉฐเจฆเฉ เจธเฉ? เจนเจพเจ, เจเจฎ เจคเฉเจฐ 'เจคเฉ เจเจน เจเจน เจธเจตเจพเจฒ เจนเฉ เจเฉ "เจคเจฟเฉฐเจจ-เจฎเฉฐเจเจผเจฒเจพ" เจธเจตเจพเจฒเจพเจ เจฆเจพ เจตเจฟเจธเจผเจฒเฉเจธเจผเจฃ เจเจฐเจจ เจฆเฉ 5เจตเฉเจ เจฎเจฟเฉฐเจ เจตเจฟเฉฑเจ เจเจฟเจคเฉ เจเจเจเจฆเจพ เจนเฉเฅค
เจ
เจธเฉเจ เจนเจฐเฉเจ เจตเจฟเจฒเฉฑเจเจฃ เจเฉเฉฐเจเฉ เจเฉเฉเฉ เจฒเจ เจเจเจเจชเฉเฉฑเจ เจเจฐเจจเจพ เจเจพเจนเฉเฉฐเจฆเฉ เจธเฉ key_a เจฆเฉเจเจฐเจพ เจธเจฎเฉเจน เจคเฉเจ เจเฉฑเจเฉ-เจเฉฑเจ/เจตเฉฑเจง เจคเฉเจ เจตเฉฑเจง.
เจคเจพเจ เจเจ เจเจธเจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเฉเจ
SELECT DISTINCT ON(key_a, key_b)
key_a a
, key_b b
, max(fld1) OVER(w) bind_fld1
, min(fld2) OVER(w) bind_fld2
FROM
tbl
WINDOW
w AS (PARTITION BY key_a);
เจเจฟเจเจเจเจฟ เจฆเฉเจตเจพเจ เจตเจฟเจเจฒเจชเจพเจ เจตเจฟเฉฑเจ เจกเฉเจเจพ เจจเฉเฉฐ เจชเฉเฉเจนเจจ เจตเจฟเฉฑเจ เจฒเจเจญเจ 4-5ms เจฒเฉฑเจเจฆเฉ เจนเจจ, เจซเจฟเจฐ เจธเจพเจกเจพ เจธเจพเจฐเจพ เจธเจฎเจพเจ เจฒเจพเจญ เจนเฉเฉฐเจฆเจพ เจนเฉ -32% - เจเจน เจเจธเจฆเฉ เจธเจผเฉเฉฑเจง เจฐเฉเจช เจตเจฟเฉฑเจ เจนเฉ เจฌเฉเจธ CPU เจคเฉเจ เจฒเฉเจก เจนเจเจพเจเจ เจเจฟเจ, เจเฉเจเจฐ เจ เจเจฟเจนเฉ เจฌเฉเจจเจคเฉ เจจเฉเฉฐ เจ เจเจธเจฐ เจเจพเจซเจผเฉ เจฒเจพเจเฉ เจเฉเจคเจพ เจเจพเจเจฆเจพ เจนเฉเฅค
เจเจฎ เจคเฉเจฐ 'เจคเฉ, เจคเฉเจนเจพเจจเฉเฉฐ เจฌเฉเจธ เจจเฉเฉฐ "เจเฉเจฒ เจจเฉเฉฐ เจฒเฉ เจเฉ เจเจพเจ, เจตเจฐเจ เจจเฉเฉฐ เจฐเฉเจฒ เจเจฐเฉ" เจฒเจ เจฎเจเจฌเฉเจฐ เจจเจนเฉเจ เจเจฐเจจเจพ เจเจพเจนเฉเจฆเจพเฅค
เจธเจฐเฉเจค: www.habr.com