āĻĒāĻ°ā§āĻ¯āĻžāĻ¯āĻŧāĻā§āĻ°āĻŽā§, āĻā§āĻā§āĻ˛āĻŋāĻ° āĻāĻāĻāĻŋ āĻ¸ā§āĻ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻāĻŋāĻ¤ āĻĄā§āĻāĻž āĻ āĻ¨ā§āĻ¸āĻ¨ā§āĻ§āĻžāĻ¨ā§āĻ° āĻāĻžāĻāĻāĻŋ āĻĻā§āĻāĻž āĻĻā§āĻ¯āĻŧāĨ¤ āĻ¯āĻ¤āĻā§āĻˇāĻŖ āĻ¨āĻž āĻāĻŽāĻ°āĻž āĻ°ā§āĻāĻ°ā§āĻĄā§āĻ° āĻĒā§āĻ°āĻ¯āĻŧā§āĻāĻ¨ā§āĻ¯āĻŧ āĻŽā§āĻ āĻ¸āĻāĻā§āĻ¯āĻž āĻĒāĻžāĻ.
āĻ¸āĻŦāĻā§āĻ¯āĻŧā§ "āĻŦāĻžāĻ¸ā§āĻ¤āĻŦ āĻā§āĻŦāĻ¨" āĻāĻĻāĻžāĻšāĻ°āĻŖ āĻĒā§āĻ°āĻĻāĻ°ā§āĻļāĻ¨ āĻāĻ°āĻž āĻšāĻ¯āĻŧ 20āĻāĻŋ āĻĒā§āĻ°āĻžāĻā§āĻ¨āĻ¤āĻŽ āĻ¸āĻŽāĻ¸ā§āĻ¯āĻž, āĻ¤āĻžāĻ˛āĻŋāĻāĻžāĻā§āĻā§āĻ¤ āĻāĻ°ā§āĻŽāĻāĻžāĻ°ā§āĻĻā§āĻ° āĻ¤āĻžāĻ˛āĻŋāĻāĻžāĻ¯āĻŧ (āĻāĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§āĻĒ, āĻāĻāĻāĻŋ āĻŦāĻŋāĻāĻžāĻā§āĻ° āĻŽāĻ§ā§āĻ¯ā§)āĨ¤ āĻāĻžāĻā§āĻ° āĻā§āĻˇā§āĻ¤ā§āĻ°āĻā§āĻ˛āĻŋāĻ° āĻ¸āĻāĻā§āĻˇāĻŋāĻĒā§āĻ¤ āĻ¸āĻžāĻ°āĻ¸āĻāĻā§āĻˇā§āĻĒ āĻ¸āĻš āĻŦāĻŋāĻāĻŋāĻ¨ā§āĻ¨ āĻĒāĻ°āĻŋāĻāĻžāĻ˛āĻ¨āĻž "āĻĄā§āĻ¯āĻžāĻļāĻŦā§āĻ°ā§āĻĄ" āĻāĻ° āĻāĻ¨ā§āĻ¯, āĻāĻāĻāĻŋ āĻ āĻ¨ā§āĻ°ā§āĻĒ āĻŦāĻŋāĻˇāĻ¯āĻŧ āĻĒā§āĻ°āĻžāĻ¯āĻŧāĻļāĻ āĻĒā§āĻ°āĻ¯āĻŧā§āĻāĻ¨ āĻšāĻ¯āĻŧāĨ¤
āĻāĻ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§ā§ āĻāĻŽāĻ°āĻž āĻĒā§āĻ¸ā§āĻāĻā§āĻ°ā§āĻāĻ¸āĻāĻŋāĻāĻāĻ˛-āĻ āĻāĻ āĻāĻžāĻ¤ā§āĻ¯āĻŧ āĻ¸āĻŽāĻ¸ā§āĻ¯āĻžāĻ° āĻāĻāĻāĻŋ "āĻ¨āĻŋāĻˇā§āĻĒāĻžāĻĒ" āĻ¸āĻŽāĻžāĻ§āĻžāĻ¨ā§āĻ° āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ āĻĻā§āĻāĻŦ, āĻāĻāĻāĻŋ "āĻ¸ā§āĻŽāĻžāĻ°ā§āĻ" āĻāĻŦāĻ āĻā§āĻŦ āĻāĻāĻŋāĻ˛ āĻ
ā§āĻ¯āĻžāĻ˛āĻāĻ°āĻŋāĻĻāĻŽāĨ¤ āĻāĻ¸āĻāĻŋāĻāĻāĻ˛-āĻ "āĻ˛ā§āĻĒ" āĻĒāĻžāĻāĻ¯āĻŧāĻž āĻĄā§āĻāĻž āĻĨā§āĻā§ āĻĒā§āĻ°āĻ¸ā§āĻĨāĻžāĻ¨ āĻāĻ°āĻžāĻ° āĻļāĻ°ā§āĻ¤ āĻ¸āĻš, āĻ¯āĻž āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ āĻŦāĻŋāĻāĻžāĻļā§āĻ° āĻāĻ¨ā§āĻ¯ āĻāĻŦāĻ āĻ
āĻ¨ā§āĻ¯āĻžāĻ¨ā§āĻ¯ āĻ
āĻ¨ā§āĻ°ā§āĻĒ āĻā§āĻˇā§āĻ¤ā§āĻ°ā§ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°ā§āĻ° āĻāĻ¨ā§āĻ¯ āĻāĻāĻ¯āĻŧāĻ āĻāĻĒāĻ¯ā§āĻā§ āĻšāĻ¤ā§ āĻĒāĻžāĻ°ā§āĨ¤
āĻāĻ° āĻĨā§āĻā§ āĻāĻāĻāĻŋ āĻā§āĻ¸ā§āĻ āĻĄā§āĻāĻž āĻ¸ā§āĻ āĻ¨ā§āĻāĻ¯āĻŧāĻž āĻ¯āĻžāĻ
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 āĻ¸āĻžāĻ°āĻŋ, āĻ¯ā§āĻāĻžāĻ āĻ¤āĻāĻ¨ āĻ¸āĻžāĻāĻžāĻ¤ā§ āĻšāĻ¯āĻŧā§āĻāĻŋāĻ˛... āĻāĻŽ āĻĒāĻĄāĻŧāĻžāĻ° āĻā§āĻˇā§āĻāĻž āĻāĻ°āĻŋāĨ¤
āĻāĻ¨ā§āĻ¸ā§āĻ + 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
āĻ¨āĻāĻ˛ āĻāĻ°āĻž āĻšāĻ¯āĻŧā§āĻā§ - āĻĒā§āĻ°āĻĨāĻŽā§ āĻāĻŽāĻ°āĻž āĻā§āĻāĻā§ āĻĒāĻžāĻ āĻ¯ā§āĻŽāĻ¨ "āĻ¤āĻžāĻ˛āĻŋāĻāĻžāĻ° ā§¨āĻ¯āĻŧ āĻāĻ¨ā§āĻā§āĻ°āĻŋāĻ° āĻ¸ā§āĻŽāĻžāĻ¨āĻž āĻ
āĻ¤āĻŋāĻā§āĻ°āĻŽ āĻāĻ°āĻž", āĻāĻŦāĻ āĻ¤āĻžāĻ°āĻĒāĻ° āĻ¤āĻžāĻ˛āĻŋāĻāĻž āĻĨā§āĻā§ ā§§āĻŽ āĻšāĻŋāĻ¸āĻžāĻŦā§ āĻĒā§āĻ°āĻ¤āĻŋāĻ¸ā§āĻĨāĻžāĻĒāĻ¨ āĻāĻ°āĻŋāĨ¤ āĻ¤āĻžāĻ āĻĒā§āĻ°āĻĨāĻŽ āĻāĻāĻ¨āĻžāĻāĻŋ āĻĢāĻŋāĻ˛ā§āĻāĻžāĻ° āĻāĻ°āĻž āĻĻāĻ°āĻāĻžāĻ°āĨ¤
āĻāĻ¯āĻŧāĻā§āĻāĻ° āĻā§āĻĄāĻŧāĻžāĻ¨ā§āĻ¤ āĻĒā§āĻ°āĻļā§āĻ¨
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