SQL HowTo: āĻ•ā§āĻ¯ā§‹āĻ¯āĻŧāĻžāĻ°ā§€āĻ¤ā§‡ āĻ¸āĻ°āĻžāĻ¸āĻ°āĻŋ āĻ•āĻŋāĻ›ā§āĻ•ā§āĻˇāĻŖ āĻ˛ā§āĻĒ āĻ˛āĻŋāĻ–ā§āĻ¨ āĻŦāĻž "āĻĒā§āĻ°āĻžāĻĨāĻŽāĻŋāĻ• āĻ¤āĻŋāĻ¨-āĻĒāĻĻāĻ•ā§āĻˇā§‡āĻĒ"

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

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

SQL HowTo: āĻ•ā§āĻ¯ā§‹āĻ¯āĻŧāĻžāĻ°ā§€āĻ¤ā§‡ āĻ¸āĻ°āĻžāĻ¸āĻ°āĻŋ āĻ•āĻŋāĻ›ā§āĻ•ā§āĻˇāĻŖ āĻ˛ā§āĻĒ āĻ˛āĻŋāĻ–ā§āĻ¨ āĻŦāĻž "āĻĒā§āĻ°āĻžāĻĨāĻŽāĻŋāĻ• āĻ¤āĻŋāĻ¨-āĻĒāĻĻāĻ•ā§āĻˇā§‡āĻĒ"

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

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

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;

SQL HowTo: āĻ•ā§āĻ¯ā§‹āĻ¯āĻŧāĻžāĻ°ā§€āĻ¤ā§‡ āĻ¸āĻ°āĻžāĻ¸āĻ°āĻŋ āĻ•āĻŋāĻ›ā§āĻ•ā§āĻˇāĻŖ āĻ˛ā§āĻĒ āĻ˛āĻŋāĻ–ā§āĻ¨ āĻŦāĻž "āĻĒā§āĻ°āĻžāĻĨāĻŽāĻŋāĻ• āĻ¤āĻŋāĻ¨-āĻĒāĻĻāĻ•ā§āĻˇā§‡āĻĒ"
[explain.tensor.ru āĻĻā§‡āĻ–ā§āĻ¨]

āĻāĻ•āĻŸā§ āĻĻā§: āĻ–āĻŋāĻ¤ - āĻ†āĻŽāĻ°āĻž āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° 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; -- ... и Ņ‚ŅƒŅ‚ - Ņ‚ĐžĐļĐĩ

SQL HowTo: āĻ•ā§āĻ¯ā§‹āĻ¯āĻŧāĻžāĻ°ā§€āĻ¤ā§‡ āĻ¸āĻ°āĻžāĻ¸āĻ°āĻŋ āĻ•āĻŋāĻ›ā§āĻ•ā§āĻˇāĻŖ āĻ˛ā§āĻĒ āĻ˛āĻŋāĻ–ā§āĻ¨ āĻŦāĻž "āĻĒā§āĻ°āĻžāĻĨāĻŽāĻŋāĻ• āĻ¤āĻŋāĻ¨-āĻĒāĻĻāĻ•ā§āĻˇā§‡āĻĒ"
[explain.tensor.ru āĻĻā§‡āĻ–ā§āĻ¨]

āĻ“āĻš, āĻ‡āĻ¤āĻŋāĻŽāĻ§ā§āĻ¯ā§‡ āĻ…āĻ¨ā§‡āĻ• āĻ­āĻžāĻ˛! 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)āĨ¤

SQL HowTo: āĻ•ā§āĻ¯ā§‹āĻ¯āĻŧāĻžāĻ°ā§€āĻ¤ā§‡ āĻ¸āĻ°āĻžāĻ¸āĻ°āĻŋ āĻ•āĻŋāĻ›ā§āĻ•ā§āĻˇāĻŖ āĻ˛ā§āĻĒ āĻ˛āĻŋāĻ–ā§āĻ¨ āĻŦāĻž "āĻĒā§āĻ°āĻžāĻĨāĻŽāĻŋāĻ• āĻ¤āĻŋāĻ¨-āĻĒāĻĻāĻ•ā§āĻˇā§‡āĻĒ"

āĻ§āĻžāĻĒ 2: "āĻĒāĻ°āĻŦāĻ°ā§āĻ¤ā§€" āĻāĻ¨ā§āĻŸā§āĻ°āĻŋ āĻ–ā§āĻāĻœā§āĻ¨

āĻāĻ–āĻ¨ āĻ¯āĻĻāĻŋ āĻ†āĻŽāĻ°āĻž āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ¤āĻžāĻ˛āĻŋāĻ•āĻž āĻĨā§‡āĻ•ā§‡ āĻĒā§āĻ°āĻĨāĻŽ āĻāĻ¨ā§āĻŸā§āĻ°āĻŋ āĻ¨āĻŋāĻ¯āĻŧā§‡ āĻļā§āĻ°ā§ āĻ•āĻ°āĻŋ āĻ¸ā§‚āĻšāĻ• āĻŦāĻ°āĻžāĻŦāĻ° "āĻ§āĻžāĻĒ" āĻ†āĻ°āĻ“ āĻŽāĻžāĻ˛āĻŋāĻ•_āĻ†āĻ‡āĻĄāĻŋ āĻ•ā§€ āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŖ āĻ•āĻ°ā§‡, āĻ¤āĻžāĻ°āĻĒāĻ°ā§‡ āĻĒāĻžāĻ“āĻ¯āĻŧāĻž āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻ°ā§‡āĻ•āĻ°ā§āĻĄāĻ—ā§āĻ˛āĻŋ āĻĢāĻ˛āĻžāĻĢāĻ˛ āĻ¨āĻŋāĻ°ā§āĻŦāĻžāĻšāĻ¨ā§‡āĻ° āĻ āĻŋāĻ• āĻĒāĻ°āĻŦāĻ°ā§āĻ¤ā§€āĻ—ā§āĻ˛āĻŋāĨ¤ āĻ…āĻŦāĻļā§āĻ¯āĻ‡, āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻ¯āĻ¤āĻ•ā§āĻˇāĻŖ āĻ¨āĻž āĻ†āĻŽāĻ°āĻž āĻŦāĻžāĻŸ āĻ•ā§€ āĻ…āĻ¤āĻŋāĻ•ā§āĻ°āĻŽ āĻ•āĻ°āĻŋ āĻ¤āĻžāĻ˛āĻŋāĻ•āĻžāĻ¯āĻŧ āĻĻā§āĻŦāĻŋāĻ¤ā§€āĻ¯āĻŧ āĻāĻ¨ā§āĻŸā§āĻ°āĻŋāĨ¤

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

SQL HowTo: āĻ•ā§āĻ¯ā§‹āĻ¯āĻŧāĻžāĻ°ā§€āĻ¤ā§‡ āĻ¸āĻ°āĻžāĻ¸āĻ°āĻŋ āĻ•āĻŋāĻ›ā§āĻ•ā§āĻˇāĻŖ āĻ˛ā§āĻĒ āĻ˛āĻŋāĻ–ā§āĻ¨ āĻŦāĻž "āĻĒā§āĻ°āĻžāĻĨāĻŽāĻŋāĻ• āĻ¤āĻŋāĻ¨-āĻĒāĻĻāĻ•ā§āĻˇā§‡āĻĒ"

āĻ…āĻ°ā§āĻĨāĻžā§Ž, āĻ†āĻŽāĻ°āĻž āĻ¸āĻŦāĻ¸āĻŽāĻ¯āĻŧ āĻĒāĻžāĻ‡ āĻ¯ā§‡ āĻ¤āĻžāĻ˛āĻŋāĻ•āĻžāĻ¯āĻŧ āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻ•ā§€āĻ—ā§āĻ˛āĻŋāĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻžāĻ§āĻŋāĻ• āĻāĻ¨ā§āĻŸā§āĻ°āĻŋ āĻ¨ā§‡āĻ‡ (āĻ¯āĻĻāĻŋ āĻāĻ¨ā§āĻŸā§āĻ°āĻŋāĻ—ā§āĻ˛āĻŋ āĻļā§‡āĻˇ āĻšāĻ¯āĻŧā§‡ āĻ¯āĻžāĻ¯āĻŧ āĻāĻŦāĻ‚ āĻ†āĻŽāĻ°āĻž "āĻ•ā§āĻ°āĻ¸" āĻ¨āĻž āĻ•āĻ°āĻŋ, āĻ¤āĻžāĻšāĻ˛ā§‡ āĻ¤āĻžāĻ˛āĻŋāĻ•āĻž āĻĨā§‡āĻ•ā§‡ āĻĒā§āĻ°āĻĨāĻŽ āĻāĻ¨ā§āĻŸā§āĻ°āĻŋāĻŸāĻŋ āĻ…āĻĻā§ƒāĻļā§āĻ¯ āĻšāĻ¯āĻŧā§‡ āĻ¯āĻžāĻŦā§‡ āĻāĻŦāĻ‚ āĻ•āĻŋāĻ›ā§āĻ‡ āĻ¯ā§‹āĻ— āĻ•āĻ°āĻž āĻšāĻŦā§‡ āĻ¨āĻž ), āĻāĻŦāĻ‚ āĻ¤āĻžāĻ°āĻž āĻ¸āĻŦāĻ¸āĻŽāĻ¯āĻŧ āĻ¸āĻžāĻœāĻžāĻ¨ā§‹ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ āĻ•ā§€ (task_date, id) āĻāĻ° āĻ•ā§āĻ°āĻŽāĻŦāĻ°ā§āĻ§āĻŽāĻžāĻ¨ āĻ•ā§āĻ°āĻŽāĻžāĻ¨ā§āĻ¸āĻžāĻ°ā§‡āĨ¤

SQL HowTo: āĻ•ā§āĻ¯ā§‹āĻ¯āĻŧāĻžāĻ°ā§€āĻ¤ā§‡ āĻ¸āĻ°āĻžāĻ¸āĻ°āĻŋ āĻ•āĻŋāĻ›ā§āĻ•ā§āĻˇāĻŖ āĻ˛ā§āĻĒ āĻ˛āĻŋāĻ–ā§āĻ¨ āĻŦāĻž "āĻĒā§āĻ°āĻžāĻĨāĻŽāĻŋāĻ• āĻ¤āĻŋāĻ¨-āĻĒāĻĻāĻ•ā§āĻˇā§‡āĻĒ"

āĻ§āĻžāĻĒ 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; -- ĐąĐĩŅ€ĐĩĐŧ Ņ‚ĐžĐģŅŒĐēĐž "ĐŊĐĩĐŋĐĩŅ€ĐĩŅĐĩĐēĐ°ŅŽŅ‰Đ¸Đĩ" СаĐŋиŅĐ¸

SQL HowTo: āĻ•ā§āĻ¯ā§‹āĻ¯āĻŧāĻžāĻ°ā§€āĻ¤ā§‡ āĻ¸āĻ°āĻžāĻ¸āĻ°āĻŋ āĻ•āĻŋāĻ›ā§āĻ•ā§āĻˇāĻŖ āĻ˛ā§āĻĒ āĻ˛āĻŋāĻ–ā§āĻ¨ āĻŦāĻž "āĻĒā§āĻ°āĻžāĻĨāĻŽāĻŋāĻ• āĻ¤āĻŋāĻ¨-āĻĒāĻĻāĻ•ā§āĻˇā§‡āĻĒ"
[explain.tensor.ru āĻĻā§‡āĻ–ā§āĻ¨]

āĻāĻ‡āĻ­āĻžāĻŦā§‡, āĻ†āĻŽāĻ°āĻž āĻāĻ•ā§āĻ¸āĻŋāĻ•āĻŋāĻ‰āĻļāĻ¨ āĻ¸āĻŽāĻ¯āĻŧā§‡āĻ° 50% āĻāĻ° āĻœāĻ¨ā§āĻ¯ 20% āĻĄā§‡āĻŸāĻž āĻ°āĻŋāĻĄ āĻŸā§āĻ°ā§‡āĻĄ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡. āĻ…āĻ°ā§āĻĨāĻžā§Ž, āĻ¯āĻĻāĻŋ āĻ†āĻĒāĻ¨āĻžāĻ° āĻŦāĻŋāĻļā§āĻŦāĻžāĻ¸ āĻ•āĻ°āĻžāĻ° āĻ•āĻžāĻ°āĻŖ āĻĨāĻžāĻ•ā§‡ āĻ¯ā§‡ āĻĒāĻĄāĻŧāĻ¤ā§‡ āĻ…āĻ¨ā§‡āĻ• āĻ¸āĻŽāĻ¯āĻŧ āĻ˛āĻžāĻ—āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡ (āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§‚āĻĒ, āĻĄā§‡āĻŸāĻž āĻĒā§āĻ°āĻžāĻ¯āĻŧāĻļāĻ‡ āĻ•ā§āĻ¯āĻžāĻļā§‡ āĻĨāĻžāĻ•ā§‡ āĻ¨āĻž āĻāĻŦāĻ‚ āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻāĻŸāĻŋāĻ° āĻœāĻ¨ā§āĻ¯ āĻĄāĻŋāĻ¸ā§āĻ•ā§‡ āĻ¯ā§‡āĻ¤ā§‡ āĻšāĻŦā§‡), āĻ¤āĻžāĻšāĻ˛ā§‡ āĻāĻ‡āĻ­āĻžāĻŦā§‡ āĻ†āĻĒāĻ¨āĻŋ āĻĒāĻĄāĻŧāĻžāĻ° āĻ‰āĻĒāĻ° āĻ•āĻŽ āĻ¨āĻŋāĻ°ā§āĻ­āĻ° āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨ .

āĻ¯āĻžāĻ‡ āĻšā§‹āĻ• āĻ¨āĻž āĻ•ā§‡āĻ¨, āĻŽā§ƒāĻ¤ā§āĻ¯ā§āĻĻāĻ¨ā§āĻĄ āĻ•āĻžāĻ°ā§āĻ¯āĻ•āĻ° āĻ•āĻ°āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧāĻŸāĻŋ "āĻ¨āĻŋāĻˇā§āĻĒāĻžāĻĒ" āĻĒā§āĻ°āĻĨāĻŽ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒā§‡āĻ° āĻšā§‡āĻ¯āĻŧā§‡ āĻ­āĻžāĻ˛ āĻŦāĻ˛ā§‡ āĻĒā§āĻ°āĻŽāĻžāĻŖāĻŋāĻ¤ āĻšāĻ¯āĻŧā§‡āĻ›āĻŋāĻ˛āĨ¤ āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻāĻ‡ 3āĻŸāĻŋ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒā§‡āĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻ•ā§‹āĻ¨āĻŸāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻŦā§‡āĻ¨ āĻ¤āĻž āĻ†āĻĒāĻ¨āĻžāĻ° āĻ‰āĻĒāĻ° āĻ¨āĻŋāĻ°ā§āĻ­āĻ° āĻ•āĻ°ā§‡āĨ¤

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

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