เจธเจฎเฉเจ-เจธเจฎเฉเจ 'เจคเฉ, เจเฉเฉฐเจเฉเจเจ เจฆเฉ เจธเจฎเฉเจน เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจเฉ เจธเฉฐเจฌเฉฐเจงเจฟเจค เจกเฉเจเจพ เจฆเฉ เจเฉเจ เจเจฐเจจ เจฆเจพ เจเฉฐเจฎ เจชเฉเจฆเจพ เจนเฉเฉฐเจฆเจพ เจนเฉเฅค เจเจฆเฉเจ เจคเฉฑเจ เจธเจพเจจเฉเฉฐ เจฐเจฟเจเจพเจฐเจกเจพเจ เจฆเฉ เจฒเฉเฉเฉเจเจฆเฉ เจเฉเฉฑเจฒ เจเจฟเจฃเจคเฉ เจจเจนเฉเจ เจฎเจฟเจฒเจฆเฉ.
เจธเจญ เจคเฉเจ "เจ เจธเจฒ เจเฉเจตเจจ" เจเจฆเจพเจนเจฐเจจ เจชเฉเจฐเจฆเจฐเจธเจผเจฟเจค เจเจฐเจจเจพ เจนเฉ 20 เจธเจญ เจคเฉเจ เจชเฉเจฐเจพเจฃเฉเจเจ เจธเจฎเฉฑเจธเจฟเจเจตเจพเจ, เจธเฉเจเฉเจฌเฉฑเจง เจเจฐเจฎเจเจพเจฐเฉเจเจ เจฆเฉ เจธเฉเจเฉ 'เจคเฉ (เจเจฆเจพเจนเจฐเจจ เจฒเจ, เจเฉฑเจ เจกเจฟเจตเฉเจเจผเจจ เจฆเฉ เจ เฉฐเจฆเจฐ). เจเฉฐเจฎ เจฆเฉ เจเฉเจคเจฐเจพเจ เจฆเฉ เจธเฉฐเจเฉเจช เจธเจพเจฐเจพเจเจธเจผเจพเจ เจตเจพเจฒเฉ เจตเฉฑเจ-เจตเฉฑเจ เจชเฉเจฐเจฌเฉฐเจงเจจ "เจกเฉเจธเจผเจฌเฉเจฐเจกเจพเจ" เจฒเจ, เจเฉฑเจ เจธเจฎเจพเจจ เจตเจฟเจธเจผเจพ เจ เจเจธเจฐ เจฒเฉเฉเฉเจเจฆเจพ เจนเฉเฉฐเจฆเจพ เจนเฉเฅค
เจเจธ เจฒเฉเจ เจตเจฟเฉฑเจ เจ
เจธเฉเจ เจ
เจเจฟเจนเฉ เจธเจฎเฉฑเจธเจฟเจ เจฆเฉ เจเฉฑเจ "เจญเฉเจฒเฉ" เจนเฉฑเจฒ เจฆเฉ PostgreSQL เจตเจฟเฉฑเจ เจฒเจพเจเฉ เจเจฐเจจ เจจเฉเฉฐ เจตเฉเจเจพเจเจเฉ, เจเฉฑเจ "เจนเฉเจธเจผเจฟเจเจฐ" เจ
เจคเฉ เจฌเจนเฉเจค เจเฉเฉฐเจเจฒเจฆเจพเจฐ เจเจฒเจเฉเจฐเจฟเจฆเจฎ เจฒเฉฑเจญเฉ เจเจ เจกเฉเจเจพ เจคเฉเจ เจฌเจพเจนเจฐ เจจเจฟเจเจฒเจฃ เจฆเฉ เจธเจฅเจฟเจคเฉ เจฆเฉ เจจเจพเจฒ SQL เจตเจฟเฉฑเจ "เจฒเฉเจช", เจเฉ เจเจฟ เจเจฎ เจตเจฟเจเจพเจธ เจ
เจคเฉ เจนเฉเจฐ เจธเจฎเจพเจจ เจฎเจพเจฎเจฒเจฟเจเจ เจตเจฟเฉฑเจ เจตเจฐเจคเฉเจ เจฒเจ เจฒเจพเจญเจฆเจพเจเจ เจนเฉ เจธเจเจฆเจพ เจนเฉเฅค
เจเจ เจเจธ เจคเฉเจ เจเฉฑเจ เจเฉเจธเจ เจกเฉเจเจพ เจธเฉเจ เจฒเฉเจเจฆเฉ เจนเจพเจ
CREATE INDEX ON task(owner_id, task_date, id);
-- ะฐ ััะฐััะน - ัะดะฐะปะธะผ
DROP INDEX task_owner_id_task_date_idx;
เจเจฟเจตเฉเจ เจธเฉเจฃเจฟเจ เจเจพเจเจฆเจพ เจนเฉ, เจคเจฟเจตเฉเจ เจฒเจฟเจเจฟเจ เจเจพเจเจฆเจพ เจนเฉ
เจชเจนเจฟเจฒเจพเจ, เจเจ เจฌเฉเจจเจคเฉ เจฆเฉ เจธเจญ เจคเฉเจ เจธเจฐเจฒ เจธเฉฐเจธเจเจฐเจฃ เจจเฉเฉฐ เจคเจฟเจเจฐ เจเจฐเฉเจ, เจชเฉเจฐเจฆเจฐเจธเจผเจจ เจเจฐเจจ เจตเจพเจฒเจฟเจเจ เจฆเฉเจเจ เจเจเจกเฉ เจชเจพเจธ เจเจฐเจฆเฉ เจนเฉเจ
SELECT
*
FROM
task
WHERE
owner_id = ANY('{1,2,4,8,16,32,64,128,256,512}'::integer[])
ORDER BY
task_date, id
LIMIT 20;
เจฅเฉเฉเจพ เจเจฆเจพเจธ - เจ เจธเฉเจ เจธเจฟเจฐเจซ 20 เจฐเจฟเจเจพเจฐเจกเจพเจ เจฆเจพ เจเจฆเฉเจธเจผ เจฆเจฟเฉฑเจคเจพ, เจชเจฐ เจเฉฐเจกเฉเจเจธ เจธเจเฉเจจ เจจเฉ เจธเจพเจจเฉเฉฐ เจเจน เจตเจพเจชเจธ เจเจฐ เจฆเจฟเฉฑเจคเจพ 960 เจฒเจพเจเจจเจพเจ, เจเจฟเจธ เจจเฉเฉฐ เจซเจฟเจฐ เจเจพเจเจเฉ เจตเฉ เจเจฐเจจเฉ เจชเจ... เจเจฒเฉ เจเฉฑเจ เจชเฉเฉเจนเจจ เจฆเฉ เจเฉเจธเจผเจฟเจธเจผ เจเจฐเฉเจเฅค
unnest + ARRAY
เจชเจนเจฟเจฒเจพ เจตเจฟเจเจพเจฐ เจเฉ เจธเจพเจกเฉ เจฎเจฆเจฆ เจเจฐเฉเจเจพ เจเฉ เจธเจพเจจเฉเฉฐ เจฒเฉเฉ เจนเฉ เจธเจฟเจฐเจซเจผ 20 เจเฉเจฐเจฎเจฌเฉฑเจง เจฐเจฟเจเจพเจฐเจก, เจซเจฟเจฐ เจธเจฟเจฐเจซเจผ เจชเฉเฉเจนเฉ เจนเจฐเฉเจ เจฒเจ เจเฉฑเจเฉ เจเฉเจฐเจฎ เจตเจฟเฉฑเจ 20 เจคเฉเจ เจตเฉฑเจง เจจเจนเฉเจ เจเฉเจฐเจฎเจฌเฉฑเจง เจเฉเฉฐเจเฉ. เจเฉฐเจเจพ, เจ เจจเฉเจเฉเจฒ เจธเฉเจเจเจพเจเจ (owner_id, task_date, id) เจธเจพเจกเฉ เจเฉเจฒ เจนเฉเฅค
เจเจ เจเจเจธเจเจฐเฉเจเจ เจเจฐเจจ เจ
เจคเฉ "เจเจพเจฒเจฎเจพเจ เจตเจฟเฉฑเจ เจซเฉเจฒเจพเจเจฃ" เจฒเจ เจเจธเฉ เจตเจฟเจงเฉ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเฉเจเฅค เจ
เจเฉเฉฑเจ เจธเจพเจฐเจฃเฉ เจฐเจฟเจเจพเจฐเจก, เจเจธ เจคเจฐเจพเจ ARRAY()
:
WITH T AS (
SELECT
unnest(ARRAY(
SELECT
t
FROM
task t
WHERE
owner_id = unnest
ORDER BY
task_date, id
LIMIT 20 -- ะพะณัะฐะฝะธัะธะฒะฐะตะผ ััั...
)) r
FROM
unnest('{1,2,4,8,16,32,64,128,256,512}'::integer[])
)
SELECT
(r).*
FROM
T
ORDER BY
(r).task_date, (r).id
LIMIT 20; -- ... ะธ ััั - ัะพะถะต
เจเจน, เจชเจนเจฟเจฒเจพเจ เจนเฉ เจฌเจนเฉเจค เจตเจงเฉเจ! 40% เจคเฉเจเจผ เจ เจคเฉ 4.5 เจเฉเจฃเจพ เจเฉฑเจ เจกเจพเจเจพ เจฎเฉเจจเฉเฉฐ เจเจน เจชเฉเฉเจนเจจเจพ เจชเจฟเจเฅค
CTE เจฆเฉเจเจฐเจพ เจเฉเจฌเจฒ เจฐเจฟเจเจพเจฐเจกเจพเจ เจฆเจพ เจชเจฆเจพเจฐเจฅเฉเจเจฐเจจเจฎเฉเจ เจคเฉเจนเจพเจกเจพ เจงเจฟเจเจจ เจเจธ เจคเฉฑเจฅ เจตเฉฑเจฒ เจเจฟเฉฑเจเจฆเจพ เจนเจพเจ เจเจฟ เจเฉเจ เจฎเจพเจฎเจฒเจฟเจเจ เจตเจฟเฉฑเจ เจเฉฑเจ เจธเจฌเจเจตเฉเจฐเฉ เจตเจฟเฉฑเจ เจเจธเจจเฉเฉฐ เจเฉเจเจฃ เจคเฉเจ เจฌเจพเจ เจฆ เจเฉฑเจ เจฐเจฟเจเจพเจฐเจก เจฆเฉ เจเฉเจคเจฐเจพเจ เจจเจพเจฒ เจคเฉเจฐเฉฐเจค เจเฉฐเจฎ เจเจฐเจจ เจฆเฉ เจเฉเจธเจผเจฟเจธเจผ, เจเจธเจจเฉเฉฐ CTE เจตเจฟเฉฑเจ "เจฒเจชเฉเจเจฃ" เจคเฉเจ เจฌเจฟเจจเจพเจ, เจเจธ เจฆเจพ เจเจพเจฐเจจ เจฌเจฃ เจธเจเจฆเฉ เจนเฉ InitPlan "เจเฉเจฃเจพ เจเจฐเฉ" เจเจนเจจเจพเจ เจธเจฎเจพเจจ เจเฉเจคเจฐเจพเจ เจฆเฉ เจธเฉฐเจเจฟเจ เจฆเฉ เจ เจจเฉเจชเจพเจคเฉ:
SELECT
((
SELECT
t
FROM
task t
WHERE
owner_id = 1
ORDER BY
task_date, id
LIMIT 1
).*);
Result (cost=4.77..4.78 rows=1 width=16) (actual time=0.063..0.063 rows=1 loops=1)
Buffers: shared hit=16
InitPlan 1 (returns $0)
-> Limit (cost=0.42..1.19 rows=1 width=48) (actual time=0.031..0.032 rows=1 loops=1)
Buffers: shared hit=4
-> Index Scan using task_owner_id_task_date_id_idx on task t (cost=0.42..387.57 rows=500 width=48) (actual time=0.030..0.030 rows=1 loops=1)
Index Cond: (owner_id = 1)
Buffers: shared hit=4
InitPlan 2 (returns $1)
-> Limit (cost=0.42..1.19 rows=1 width=48) (actual time=0.008..0.009 rows=1 loops=1)
Buffers: shared hit=4
-> Index Scan using task_owner_id_task_date_id_idx on task t_1 (cost=0.42..387.57 rows=500 width=48) (actual time=0.008..0.008 rows=1 loops=1)
Index Cond: (owner_id = 1)
Buffers: shared hit=4
InitPlan 3 (returns $2)
-> Limit (cost=0.42..1.19 rows=1 width=48) (actual time=0.008..0.008 rows=1 loops=1)
Buffers: shared hit=4
-> Index Scan using task_owner_id_task_date_id_idx on task t_2 (cost=0.42..387.57 rows=500 width=48) (actual time=0.008..0.008 rows=1 loops=1)
Index Cond: (owner_id = 1)
Buffers: shared hit=4"
InitPlan 4 (returns $3)
-> Limit (cost=0.42..1.19 rows=1 width=48) (actual time=0.009..0.009 rows=1 loops=1)
Buffers: shared hit=4
-> Index Scan using task_owner_id_task_date_id_idx on task t_3 (cost=0.42..387.57 rows=500 width=48) (actual time=0.009..0.009 rows=1 loops=1)
Index Cond: (owner_id = 1)
Buffers: shared hit=4
เจเจนเฉ เจฐเจฟเจเจพเจฐเจก 4 เจตเจพเจฐ "เจตเฉเจเจฟเจ เจเจฟเจ" เจธเฉ... PostgreSQL 11 เจคเฉฑเจ, เจเจน เจตเจฟเจตเจนเจพเจฐ เจจเจฟเจฏเจฎเจฟเจค เจคเฉเจฐ 'เจคเฉ เจตเจพเจชเจฐเจฆเจพ เจนเฉ, เจ เจคเฉ เจนเฉฑเจฒ เจนเฉ เจเจธเจจเฉเฉฐ CTE เจตเจฟเฉฑเจ "เจฒเจชเฉเจเจฃเจพ", เจเฉ เจเจฟ เจเจนเจจเจพเจ เจธเฉฐเจธเจเจฐเจฃเจพเจ เจตเจฟเฉฑเจ เจเจชเจเฉเจฎเจพเจเจเจผเจฐ เจฒเจ เจเฉฑเจ เจชเฉเจฐเจจ เจธเฉเจฎเจพ เจนเฉเฅค
เจเจตเจฐเจคเฉ เจธเฉฐเจเจตเจ
เจชเจฟเจเจฒเฉ เจธเฉฐเจธเจเจฐเจฃ เจตเจฟเฉฑเจ, เจเฉเฉฑเจฒ เจฎเจฟเจฒเจพ เจเฉ เจ เจธเฉเจ เจชเฉเฉเจนเจฟเจ เจนเฉ 200 เจฒเจพเจเจจเจพเจ เจฒเฉเฉเฉเจเจฆเฉ 20 เจฆเฉ เจเจผเจพเจคเจฐ. 960 เจจเจนเฉเจ, เจชเจฐ เจเจธ เจคเฉเจ เจตเฉ เจเฉฑเจ - เจเฉ เจเจน เจธเฉฐเจญเจต เจนเฉ?
เจเจ เจเจธ เจเจฟเจเจจ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจจ เจฆเฉ เจเฉเจธเจผเจฟเจธเจผ เจเจฐเฉเจ เจเจฟเจธเจฆเฉ เจธเจพเจจเฉเฉฐ เจฒเฉเฉ เจนเฉ เจเฉเฉฑเจฒ 20 เจฐเจฟเจเจพเจฐเจกเฅค เจญเจพเจต, เจ เจธเฉเจ เจกเฉเจเจพ เจฐเฉเจกเจฟเฉฐเจ เจจเฉเฉฐ เจเจฆเฉเจ เจคเฉฑเจ เจฆเฉเจนเจฐเจพเจตเจพเจเจเฉ เจเจฆเฉเจ เจคเฉฑเจ เจ เจธเฉเจ เจฒเฉเฉเฉเจเจฆเฉ เจฎเจพเจคเจฐเจพ เจคเฉฑเจ เจจเจนเฉเจ เจชเจนเฉเฉฐเจเจฆเฉเฅค
เจเจฆเจฎ 1: เจธเจผเฉเจฐเฉเจเจคเฉ เจธเฉเจเฉ
เจธเจชเฉฑเจธเจผเจ เจคเฉเจฐ 'เจคเฉ, 20 เจฐเจฟเจเจพเจฐเจกเจพเจ เจฆเฉ เจธเจพเจกเฉ "เจจเจฟเจธเจผเจพเจจเจพ" เจธเฉเจเฉ เจธเจพเจกเฉ เจฎเจพเจฒเจ_เจเจเจกเฉ เจเฉเฉฐเจเฉเจเจ เจตเจฟเฉฑเจเฉเจ เจเฉฑเจ เจฒเจ "เจชเจนเจฟเจฒเฉ" เจฐเจฟเจเจพเจฐเจกเจพเจ เจจเจพเจฒ เจธเจผเฉเจฐเฉ เจนเฉเจฃเฉ เจเจพเจนเฉเจฆเฉ เจนเฉเฅค เจเจธ เจฒเจ, เจชเจนเจฟเจฒเจพเจ เจ เจธเฉเจ เจ เจเจฟเจนเฉ เจฒเฉฑเจญเจพเจเจเฉ เจนเจฐเฉเจ เจเฉเฉฐเจเฉ เจฒเจ "เจฌเจนเฉเจค เจชเจนเจฟเจฒเจพเจ" เจ เจคเฉ เจเจธเจจเฉเฉฐ เจธเฉเจเฉ เจตเจฟเฉฑเจ เจธเจผเจพเจฎเจฒ เจเจฐเฉ, เจเจธ เจจเฉเฉฐ เจเจธ เจเฉเจฐเจฎ เจตเจฟเฉฑเจ เจเฉเจฐเจฎเจฌเฉฑเจง เจเจฐเจฆเฉ เจนเฉเจ เจเฉ เจ เจธเฉเจ เจเจพเจนเฉเฉฐเจฆเฉ เจนเจพเจ - (task_date, id)เฅค
เจเจฆเจฎ 2: "เจ เจเจฒเฉ" เจเจเจเจฐเฉเจเจ เจฒเฉฑเจญเฉ
เจนเฉเจฃ เจเฉ เจ เจธเฉเจ เจเจชเจฃเฉ เจธเฉเจเฉ เจตเจฟเฉฑเจเฉเจ เจชเจนเจฟเจฒเฉ เจเจเจเจฐเฉ เจฒเฉเจเจฆเฉ เจนเจพเจ เจ เจคเฉ เจธเจผเฉเจฐเฉ เจเจฐเจฆเฉ เจนเจพเจ เจธเฉเจเจเจพเจเจ เจฆเฉ เจจเจพเจฒ "เจเจฆเจฎ" เจนเฉเจฐ เจ เฉฑเจเฉ เจฎเจพเจฒเจ_เจเจเจกเฉ เจเฉเฉฐเจเฉ เจจเฉเฉฐ เจธเฉเจฐเฉฑเจเจฟเจ เจค เจเจฐเจฆเฉ เจนเฉเจ, เจซเจฟเจฐ เจธเจพเจฐเฉ เจฎเจฟเจฒเฉ เจฐเจฟเจเจพเจฐเจก เจจเจคเฉเจเฉ เจฆเฉ เจเฉเจฃ เจตเจฟเฉฑเจ เจฌเจฟเจฒเจเฉเจฒ เจ เจเจฒเฉ เจนเจจเฅค เจฌเฉเจธเจผเฉฑเจ, เจธเจฟเจฐเจซเจผ เจเจฆเฉเจ เจคเฉฑเจ เจ เจธเฉเจ เจฌเฉฑเจ เจเฉเฉฐเจเฉ เจจเฉเฉฐ เจชเจพเจฐ เจจเจนเฉเจ เจเจฐเจฆเฉ เจธเฉเจเฉ เจตเจฟเฉฑเจ เจฆเฉเจเฉ เจเจเจเจฐเฉเฅค
เจเฉ เจเจน เจชเจคเจพ เจเจฒเจฆเจพ เจนเฉ เจเจฟ เจ เจธเฉเจ เจฆเฉเจเฉ เจฐเจฟเจเจพเจฐเจก เจจเฉเฉฐ "เจชเจพเจฐ" เจเจฐ เจฆเจฟเฉฑเจคเจพ เจนเฉ, เจคเจพเจ เจชเฉเฉเจนเฉ เจเจ เจเจเจฐเฉ เจเจเจเจฐเฉ เจชเจนเจฟเจฒเฉ เจฆเฉ เจฌเจเจพเจ เจธเฉเจเฉ เจตเจฟเฉฑเจ เจธเจผเจพเจฎเจฒ เจเฉเจคเฉ เจเจพเจฃเฉ เจเจพเจนเฉเจฆเฉ เจนเฉ (เจเจธเฉ เจฎเจพเจฒเจ_เจเจเจกเฉ เจฆเฉ เจจเจพเจฒ), เจเจฟเจธ เจคเฉเจ เจฌเจพเจ เจฆ เจ เจธเฉเจ เจธเฉเจเฉ เจจเฉเฉฐ เจฆเฉเจฌเจพเจฐเจพ เจเฉเจฐเจฎเจฌเฉฑเจง เจเจฐเจฆเฉ เจนเจพเจเฅค
เจญเจพเจต, เจ
เจธเฉเจ เจนเจฎเฉเจธเจผเจพเจ เจเจน เจชเฉเจฐเจพเจชเจค เจเจฐเจฆเฉ เจนเจพเจ เจเจฟ เจธเฉเจเฉ เจตเจฟเฉฑเจ เจนเจฐเฉเจ เจเฉเฉฐเจเฉ เจฒเจ เจเฉฑเจ เจคเฉเจ เจตเฉฑเจง เจเจเจเจฐเฉ เจจเจนเฉเจ เจนเฉ (เจเฉเจเจฐ เจเจเจเจฐเฉเจเจ เจเจคเจฎ เจนเฉ เจเจพเจเจฆเฉเจเจ เจนเจจ เจ
เจคเฉ เจ
เจธเฉเจ "เจเจฐเจพเจธ" เจจเจนเฉเจ เจเจฐเจฆเฉ เจนเจพเจ, เจคเจพเจ เจธเฉเจเฉ เจตเจฟเฉฑเจเฉเจ เจชเจนเจฟเจฒเฉ เจเจเจเจฐเฉ เจเจพเจเจฌ เจนเฉ เจเจพเจตเฉเจเฉ เจ
เจคเฉ เจเฉเจ เจตเฉ เจธเจผเจพเจฎเจฒ เจจเจนเฉเจ เจเฉเจคเจพ เจเจพเจตเฉเจเจพเฅค ), เจ
เจคเฉ เจเจน เจนเจฎเฉเจธเจผเจพ เจเฉเจฐเจฎเจฌเฉฑเจง เจเจชเจฒเฉเจเฉเจธเจผเจจ เจเฉเฉฐเจเฉ (task_date, id) เจฆเฉ เจตเจงเจฆเฉ เจเฉเจฐเจฎ เจตเจฟเฉฑเจเฅค
เจเจฆเจฎ 3: เจฐเจฟเจเจพเจฐเจกเจพเจ เจจเฉเฉฐ เจซเจฟเจฒเจเจฐ เจเจฐเฉ เจ เจคเฉ "เจตเจฟเจธเจคเจพเจฐ เจเจฐเฉ"
เจธเจพเจกเฉ เจเจตเจฐเจคเฉ เจเฉเจฃ เจฆเฉ เจเฉเจ เจเจคเจพเจฐเจพเจ เจตเจฟเฉฑเจ, เจเฉเจ เจฐเจฟเจเจพเจฐเจก rv
เจกเฉเจชเจฒเฉเจเฉเจ เจนเจจ - เจชเจนเจฟเจฒเจพเจ เจ
เจธเฉเจ "เจธเฉเจเฉ เจฆเฉ เจฆเฉเจเฉ เจเจเจเจฐเฉ เจฆเฉ เจฌเจพเจฐเจกเจฐ เจชเจพเจฐ เจเจฐเจจเจพ" เจตเจฐเจเฉ เจฒเฉฑเจญเจฆเฉ เจนเจพเจ, เจ
เจคเฉ เจซเจฟเจฐ เจเจธเจจเฉเฉฐ เจธเฉเจเฉ เจตเจฟเฉฑเจเฉเจ 2 เจฆเฉ เจคเฉเจฐ 'เจคเฉ เจฌเจฆเจฒเจฆเฉ เจนเจพเจเฅค เจเจธ เจฒเจ เจชเจนเจฟเจฒเฉ เจเจเจจเจพ เจจเฉเฉฐ เจซเจฟเจฒเจเจฐ เจเจฐเจจ เจฆเฉ เจฒเฉเฉ เจนเฉ.
เจเจผเฉเจซเจผเจจเจพเจ เจ เฉฐเจคเจฟเจฎ เจชเฉเฉฑเจเจเจฟเฉฑเจ
WITH RECURSIVE T AS (
-- #1 : ะทะฐะฝะพัะธะผ ะฒ ัะฟะธัะพะบ "ะฟะตัะฒัะต" ะทะฐะฟะธัะธ ะฟะพ ะบะฐะถะดะพะผั ะธะท ะบะปััะตะน ะฝะฐะฑะพัะฐ
WITH wrap AS ( -- "ะผะฐัะตัะธะฐะปะธะทัะตะผ" record'ั, ััะพะฑั ะพะฑัะฐัะตะฝะธะต ะบ ะฟะพะปัะผ ะฝะต ะฒัะทัะฒะฐะปะพ ัะผะฝะพะถะตะฝะธั InitPlan/SubPlan
WITH T AS (
SELECT
(
SELECT
r
FROM
task r
WHERE
owner_id = unnest
ORDER BY
task_date, id
LIMIT 1
) r
FROM
unnest('{1,2,4,8,16,32,64,128,256,512}'::integer[])
)
SELECT
array_agg(r ORDER BY (r).task_date, (r).id) list -- ัะพััะธััะตะผ ัะฟะธัะพะบ ะฒ ะฝัะถะฝะพะผ ะฟะพััะดะบะต
FROM
T
)
SELECT
list
, list[1] rv
, FALSE not_cross
, 0 size
FROM
wrap
UNION ALL
-- #2 : ะฒััะธััะฒะฐะตะผ ะทะฐะฟะธัะธ 1-ะณะพ ะฟะพ ะฟะพััะดะบั ะบะปััะฐ, ะฟะพะบะฐ ะฝะต ะฟะตัะตัะฐะณะฝะตะผ ัะตัะตะท ะทะฐะฟะธัั 2-ะณะพ
SELECT
CASE
-- ะตัะปะธ ะฝะธัะตะณะพ ะฝะต ะฝะฐะนะดะตะฝะพ ะดะปั ะบะปััะฐ 1-ะน ะทะฐะฟะธัะธ
WHEN X._r IS NOT DISTINCT FROM NULL THEN
T.list[2:] -- ัะฑะธัะฐะตะผ ะตะต ะธะท ัะฟะธัะบะฐ
-- ะตัะปะธ ะผั ะะ ะฟะตัะตัะตะบะปะธ ะฟัะธะบะปะฐะดะฝะพะน ะบะปัั 2-ะน ะทะฐะฟะธัะธ
WHEN X.not_cross THEN
T.list -- ะฟัะพััะพ ะฟัะพััะณะธะฒะฐะตะผ ัะพั ะถะต ัะฟะธัะพะบ ะฑะตะท ะผะพะดะธัะธะบะฐัะธะน
-- ะตัะปะธ ะฒ ัะฟะธัะบะต ัะถะต ะฝะตั 2-ะน ะทะฐะฟะธัะธ
WHEN T.list[2] IS NULL THEN
-- ะฟัะพััะพ ะฒะพะทะฒัะฐัะฐะตะผ ะฟัััะพะน ัะฟะธัะพะบ
'{}'
-- ะฟะตัะตัะพััะธัะพะฒัะฒะฐะตะผ ัะปะพะฒะฐัั, ัะฑะธัะฐั 1-ั ะทะฐะฟะธัั ะธ ะดะพะฑะฐะฒะปัั ะฟะพัะปะตะดะฝัั ะธะท ะฝะฐะนะดะตะฝะฝัั
ELSE (
SELECT
coalesce(T.list[2] || array_agg(r ORDER BY (r).task_date, (r).id), '{}')
FROM
unnest(T.list[3:] || X._r) r
)
END
, X._r
, X.not_cross
, T.size + X.not_cross::integer
FROM
T
, LATERAL(
WITH wrap AS ( -- "ะผะฐัะตัะธะฐะปะธะทัะตะผ" record
SELECT
CASE
-- ะตัะปะธ ะฒัะต-ัะฐะบะธ "ะฟะตัะตัะฐะณะฝัะปะธ" ัะตัะตะท 2-ั ะทะฐะฟะธัั
WHEN NOT T.not_cross
-- ัะพ ะฝัะถะฝะฐั ะทะฐะฟะธัั - ะฟะตัะฒะฐั ะธะท ัะฟะฟะธัะบะฐ
THEN T.list[1]
ELSE ( -- ะตัะปะธ ะฝะต ะฟะตัะตัะตะบะปะธ, ัะพ ะบะปัั ะพััะฐะปัั ะบะฐะบ ะฒ ะฟัะตะดัะดััะตะน ะทะฐะฟะธัะธ - ะพััะฐะปะบะธะฒะฐะตะผัั ะพั ะฝะตะต
SELECT
_r
FROM
task _r
WHERE
owner_id = (rv).owner_id AND
(task_date, id) > ((rv).task_date, (rv).id)
ORDER BY
task_date, id
LIMIT 1
)
END _r
)
SELECT
_r
, CASE
-- ะตัะปะธ 2-ะน ะทะฐะฟะธัะธ ัะถะต ะฝะตั ะฒ ัะฟะธัะบะต, ะฝะพ ะผั ั
ะพัั ััะพ-ัะพ ะฝะฐัะปะธ
WHEN list[2] IS NULL AND _r IS DISTINCT FROM NULL THEN
TRUE
ELSE -- ะฝะธัะตะณะพ ะฝะต ะฝะฐัะปะธ ะธะปะธ "ะฟะตัะตัะฐะณะฝัะปะธ"
coalesce(((_r).task_date, (_r).id) < ((list[2]).task_date, (list[2]).id), FALSE)
END not_cross
FROM
wrap
) X
WHERE
T.size < 20 AND -- ะพะณัะฐะฝะธัะธะฒะฐะตะผ ััั ะบะพะปะธัะตััะฒะพ
T.list IS DISTINCT FROM '{}' -- ะธะปะธ ะฟะพะบะฐ ัะฟะธัะพะบ ะฝะต ะบะพะฝัะธะปัั
)
-- #3 : "ัะฐะทะฒะพัะฐัะธะฒะฐะตะผ" ะทะฐะฟะธัะธ - ะฟะพััะดะพะบ ะณะฐัะฐะฝัะธัะพะฒะฐะฝ ะฟะพ ะฟะพัััะพะตะฝะธั
SELECT
(rv).*
FROM
T
WHERE
not_cross; -- ะฑะตัะตะผ ัะพะปัะบะพ "ะฝะตะฟะตัะตัะตะบะฐััะธะต" ะทะฐะฟะธัะธ
เจเจธ เจคเจฐเฉเจนเจพเจ, เจ เจธเฉเจ เจเจเจเจผเฉเจเจฟเจเจธเจผเจจ เจเจพเจเจฎ เจฆเฉ 50% เจฒเจ 20% เจกเจพเจเจพ เจฐเฉเจก เจเฉเจคเจพ เจเจฟเจ. เจญเจพเจต, เจเฉเจเจฐ เจคเฉเจนเจพเจกเฉ เจเฉเจฒ เจเจน เจตเจฟเจธเจผเจตเจพเจธ เจเจฐเจจ เจฆเฉ เจเจพเจฐเจจ เจนเจจ เจเจฟ เจชเฉเฉเจนเจจ เจตเจฟเฉฑเจ เจฌเจนเฉเจค เจธเจฎเจพเจ เจฒเฉฑเจ เจธเจเจฆเจพ เจนเฉ (เจเจฆเจพเจนเจฐเจฃ เจตเจเฉเจ, เจกเฉเจเจพ เจ เจเจธเจฐ เจเฉเจธเจผ เจตเจฟเฉฑเจ เจจเจนเฉเจ เจนเฉเฉฐเจฆเจพ เจนเฉ, เจ เจคเฉ เจคเฉเจนเจพเจจเฉเฉฐ เจเจธเจฆเฉ เจฒเจ เจกเจฟเจธเจ 'เจคเฉ เจเจพเจฃเจพ เจชเฉเจเจฆเจพ เจนเฉ), เจคเจพเจ เจเจธ เจคเจฐเฉเจนเจพเจ เจคเฉเจธเฉเจ เจชเฉเฉเจนเจจ 'เจคเฉ เจเฉฑเจ เจจเจฟเจฐเจญเจฐ เจเจฐ เจธเจเจฆเฉ เจนเฉเฅค .
เจเจฟเจธเฉ เจตเฉ เจธเจฅเจฟเจคเฉ เจตเจฟเฉฑเจ, เจซเจพเจเจธเฉ เจฆเจพ เจธเจฎเจพเจ "เจญเฉเจฒเฉ" เจชเจนเจฟเจฒเฉ เจตเจฟเจเจฒเจช เจจเจพเจฒเฉเจ เจฌเจฟเจนเจคเจฐ เจจเจฟเจเจฒเจฟเจเฅค เจชเจฐ เจเจนเจจเจพเจ 3 เจตเจฟเจเจฒเจชเจพเจ เจตเจฟเฉฑเจเฉเจ เจเจฟเจนเฉเจพ เจตเจฐเจคเจฃเจพ เจนเฉ เจคเฉเจนเจพเจกเฉ 'เจคเฉ เจจเจฟเจฐเจญเจฐ เจเจฐเจฆเจพ เจนเฉเฅค
เจธเจฐเฉเจค: www.habr.com