PostgreSQL-āĻ āĻ¸āĻŽāĻžāĻ¨ā§āĻ¤āĻ°āĻžāĻ˛ āĻĒā§āĻ°āĻļā§āĻ¨

PostgreSQL-āĻ āĻ¸āĻŽāĻžāĻ¨ā§āĻ¤āĻ°āĻžāĻ˛ āĻĒā§āĻ°āĻļā§āĻ¨
āĻ†āĻ§ā§āĻ¨āĻŋāĻ• CPU-āĻ¤ā§‡ āĻĒā§āĻ°āĻšā§āĻ° āĻ•ā§‹āĻ° āĻĨāĻžāĻ•ā§‡āĨ¤ āĻŦāĻ›āĻ°ā§‡āĻ° āĻĒāĻ° āĻŦāĻ›āĻ° āĻ§āĻ°ā§‡, āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨āĻ—ā§āĻ˛āĻŋ āĻ¸āĻŽāĻžāĻ¨ā§āĻ¤āĻ°āĻžāĻ˛āĻ­āĻžāĻŦā§‡ āĻĄā§‡āĻŸāĻžāĻŦā§‡āĻ¸ā§‡ āĻĒā§āĻ°āĻļā§āĻ¨ āĻĒāĻžāĻ āĻžāĻšā§āĻ›ā§‡āĨ¤ āĻ¯āĻĻāĻŋ āĻāĻŸāĻŋ āĻāĻ•āĻŸāĻŋ āĻŸā§‡āĻŦāĻŋāĻ˛ā§‡āĻ° āĻāĻ•āĻžāĻ§āĻŋāĻ• āĻ¸āĻžāĻ°āĻŋāĻ¤ā§‡ āĻāĻ•āĻŸāĻŋ āĻĒā§āĻ°āĻ¤āĻŋāĻŦā§‡āĻĻāĻ¨ā§‡āĻ° āĻĒā§āĻ°āĻļā§āĻ¨ āĻšāĻ¯āĻŧ, āĻ¤āĻŦā§‡ āĻāĻ•āĻžāĻ§āĻŋāĻ• CPU āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻāĻŸāĻŋ āĻĻā§āĻ°ā§āĻ¤ āĻšāĻ˛ā§‡ āĻāĻŦāĻ‚ PostgreSQL āĻ¸āĻ‚āĻ¸ā§āĻ•āĻ°āĻŖ 9.6 āĻĨā§‡āĻ•ā§‡ āĻāĻŸāĻŋ āĻ•āĻ°āĻ¤ā§‡ āĻ¸āĻ•ā§āĻˇāĻŽ āĻšāĻ¯āĻŧā§‡āĻ›ā§‡āĨ¤

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

āĻ¸ā§€āĻŽāĻžāĻŦāĻĻā§āĻ§āĻ¤āĻž

  • āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻ•ā§‹āĻ° āĻ‡āĻ¤āĻŋāĻŽāĻ§ā§āĻ¯ā§‡āĻ‡ āĻŦā§āĻ¯āĻ¸ā§āĻ¤ āĻĨāĻžāĻ•āĻ˛ā§‡ āĻ¸āĻŽāĻžāĻ¨ā§āĻ¤āĻ°āĻžāĻ˛ āĻ¸āĻŽā§āĻĒāĻžāĻĻāĻ¨ āĻ¸āĻ•ā§āĻˇāĻŽ āĻ•āĻ°āĻŦā§‡āĻ¨ āĻ¨āĻž, āĻ…āĻ¨ā§āĻ¯āĻĨāĻžāĻ¯āĻŧ āĻ…āĻ¨ā§āĻ¯āĻžāĻ¨ā§āĻ¯ āĻ…āĻ¨ā§āĻ°ā§‹āĻ§āĻ—ā§āĻ˛āĻŋ āĻ§ā§€āĻ° āĻšāĻ¯āĻŧā§‡ āĻ¯āĻžāĻŦā§‡āĨ¤
  • āĻ¸āĻŦāĻšā§‡āĻ¯āĻŧā§‡ āĻ—ā§āĻ°ā§āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖ, āĻ‰āĻšā§āĻš WORK_MEM āĻŽāĻžāĻ¨ āĻ¸āĻš āĻ¸āĻŽāĻžāĻ¨ā§āĻ¤āĻ°āĻžāĻ˛ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ•āĻ°āĻŖ āĻ…āĻ¨ā§‡āĻ• āĻŽā§‡āĻŽāĻ°āĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ - āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻšā§āĻ¯āĻžāĻļ āĻ¯ā§‹āĻ—āĻĻāĻžāĻ¨ āĻŦāĻž āĻ¸āĻžāĻœāĻžāĻ¨ā§‹āĻ° āĻ•āĻžāĻœ_āĻŽā§‡āĻŽ āĻŽā§‡āĻŽāĻ°āĻŋ āĻ—ā§āĻ°āĻšāĻŖ āĻ•āĻ°ā§‡āĨ¤
  • āĻ•āĻŽ āĻ˛ā§‡āĻŸā§‡āĻ¨ā§āĻ¸āĻŋ OLTP āĻĒā§āĻ°āĻļā§āĻ¨ āĻ¸āĻŽāĻžāĻ¨ā§āĻ¤āĻ°āĻžāĻ˛ āĻ¸āĻŽā§āĻĒāĻžāĻĻāĻ¨ āĻĻā§āĻŦāĻžāĻ°āĻž āĻ¤ā§āĻŦāĻ°āĻžāĻ¨ā§āĻŦāĻŋāĻ¤ āĻ•āĻ°āĻž āĻ¯āĻžāĻŦā§‡ āĻ¨āĻžāĨ¤ āĻāĻŦāĻ‚ āĻ¯āĻĻāĻŋ āĻ•ā§āĻ¯ā§‹āĻ¯āĻŧāĻžāĻ°ā§€ āĻāĻ•āĻŸāĻŋ āĻ¸āĻžāĻ°āĻŋ āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻ•āĻ°ā§‡, āĻ¸āĻŽāĻžāĻ¨ā§āĻ¤āĻ°āĻžāĻ˛ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ•āĻ°āĻŖ āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻāĻŸāĻŋāĻ•ā§‡ āĻ§ā§€āĻ° āĻ•āĻ°ā§‡ āĻĻā§‡āĻŦā§‡āĨ¤
  • āĻŦāĻŋāĻ•āĻžāĻļāĻ•āĻžāĻ°ā§€āĻ°āĻž TPC-H āĻŦā§‡āĻžā§āĻšāĻŽāĻžāĻ°ā§āĻ• āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻ›āĻ¨ā§āĻĻ āĻ•āĻ°ā§‡āĨ¤ āĻšāĻ¯āĻŧāĻ¤ā§‹ āĻ†āĻĒāĻ¨āĻžāĻ° āĻ¨āĻŋāĻ–ā§āĻāĻ¤ āĻ¸āĻŽāĻžāĻ¨ā§āĻ¤āĻ°āĻžāĻ˛ āĻŽā§ƒāĻ¤ā§āĻ¯ā§āĻĻāĻ¨ā§āĻĄā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ…āĻ¨ā§āĻ°ā§‚āĻĒ āĻĒā§āĻ°āĻļā§āĻ¨ āĻ†āĻ›ā§‡āĨ¤
  • āĻĒā§‚āĻ°ā§āĻŦāĻ¨āĻŋāĻ°ā§āĻ§āĻžāĻ°āĻŋāĻ¤ āĻ˛āĻ•āĻŋāĻ‚ āĻ›āĻžāĻĄāĻŧāĻž āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° SELECT āĻĒā§āĻ°āĻļā§āĻ¨āĻ—ā§āĻ˛āĻŋ āĻ¸āĻŽāĻžāĻ¨ā§āĻ¤āĻ°āĻžāĻ˛āĻ­āĻžāĻŦā§‡ āĻ•āĻžāĻ°ā§āĻ¯āĻ•āĻ° āĻ•āĻ°āĻž āĻšāĻ¯āĻŧāĨ¤
  • āĻ•āĻ–āĻ¨āĻ“ āĻ•āĻ–āĻ¨āĻ“ āĻ¸āĻ āĻŋāĻ• āĻ¸ā§‚āĻšā§€āĻ•āĻ°āĻŖ āĻ¸āĻŽāĻžāĻ¨ā§āĻ¤āĻ°āĻžāĻ˛ āĻŽā§‹āĻĄā§‡ āĻ•ā§āĻ°āĻŽāĻŋāĻ• āĻŸā§‡āĻŦāĻŋāĻ˛ āĻ¸ā§āĻ•ā§āĻ¯āĻžāĻ¨āĻŋāĻ‚āĻ¯āĻŧā§‡āĻ° āĻšā§‡āĻ¯āĻŧā§‡ āĻ­āĻžāĻ˛āĨ¤
  • āĻĒāĻœ āĻ•āĻ°āĻž āĻĒā§āĻ°āĻļā§āĻ¨ āĻāĻŦāĻ‚ āĻ•āĻžāĻ°ā§āĻ¸āĻžāĻ° āĻ¸āĻŽāĻ°ā§āĻĨāĻŋāĻ¤ āĻ¨āĻ¯āĻŧāĨ¤
  • āĻ‰āĻ‡āĻ¨ā§āĻĄā§‹ āĻĢāĻžāĻ‚āĻļāĻ¨ āĻāĻŦāĻ‚ āĻ…āĻ°ā§āĻĄāĻžāĻ°āĻ•ā§ƒāĻ¤ āĻ¸ā§‡āĻŸ āĻ¸āĻžāĻŽāĻ—ā§āĻ°āĻŋāĻ• āĻĢāĻžāĻ‚āĻļāĻ¨ āĻ¸āĻŽāĻžāĻ¨ā§āĻ¤āĻ°āĻžāĻ˛ āĻ¨āĻ¯āĻŧāĨ¤
  • I/O āĻ•āĻžāĻœā§‡āĻ° āĻšāĻžāĻĒā§‡ āĻ†āĻĒāĻ¨āĻŋ āĻ•āĻŋāĻ›ā§āĻ‡ āĻ˛āĻžāĻ­ āĻ•āĻ°āĻŦā§‡āĻ¨ āĻ¨āĻžāĨ¤
  • āĻ•ā§‹āĻ¨ āĻ¸āĻŽāĻžāĻ¨ā§āĻ¤āĻ°āĻžāĻ˛ āĻŦāĻžāĻ›āĻžāĻ‡ āĻ…ā§āĻ¯āĻžāĻ˛āĻ—āĻ°āĻŋāĻĻāĻŽ āĻ†āĻ›ā§‡. āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻ•āĻŋāĻ›ā§ āĻŦāĻŋāĻˇāĻ¯āĻŧā§‡ āĻ¸āĻŽāĻžāĻ¨ā§āĻ¤āĻ°āĻžāĻ˛āĻ­āĻžāĻŦā§‡ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āĻ¨ āĻ§āĻ°āĻŖā§‡āĻ° āĻĒā§āĻ°āĻļā§āĻ¨ āĻ•āĻ°āĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤
  • āĻ¸āĻŽāĻžāĻ¨ā§āĻ¤āĻ°āĻžāĻ˛ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ•āĻ°āĻŖ āĻ¸āĻ•ā§āĻˇāĻŽ āĻ•āĻ°āĻ¤ā§‡ āĻāĻ•āĻŸāĻŋ āĻ¨ā§‡āĻ¸ā§āĻŸā§‡āĻĄ SELECT āĻĻāĻŋāĻ¯āĻŧā§‡ CTE (āĻ¸āĻš ...) āĻĒā§āĻ°āĻ¤āĻŋāĻ¸ā§āĻĨāĻžāĻĒāĻ¨ āĻ•āĻ°ā§āĻ¨āĨ¤
  • āĻ¤ā§ƒāĻ¤ā§€āĻ¯āĻŧ āĻĒāĻ•ā§āĻˇā§‡āĻ° āĻĄā§‡āĻŸāĻž āĻŽā§‹āĻĄāĻŧāĻ•āĻ—ā§āĻ˛āĻŋ āĻāĻ–āĻ¨āĻ“ āĻ¸āĻŽāĻžāĻ¨ā§āĻ¤āĻ°āĻžāĻ˛ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ•āĻ°āĻŖ āĻ¸āĻŽāĻ°ā§āĻĨāĻ¨ āĻ•āĻ°ā§‡ āĻ¨āĻž (āĻ¤āĻŦā§‡ āĻ¤āĻžāĻ°āĻž āĻĒāĻžāĻ°ā§‡!)
  • āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻŦāĻžāĻ‡āĻ°ā§‡āĻ° āĻ¯ā§‹āĻ—āĻĻāĻžāĻ¨ āĻ¸āĻŽāĻ°ā§āĻĨāĻŋāĻ¤ āĻ¨āĻ¯āĻŧāĨ¤
  • max_rows āĻ¸āĻŽāĻžāĻ¨ā§āĻ¤āĻ°āĻžāĻ˛ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ•āĻ°āĻŖ āĻ¨āĻŋāĻˇā§āĻ•ā§āĻ°āĻŋāĻ¯āĻŧ āĻ•āĻ°ā§‡āĨ¤
  • āĻ¯āĻĻāĻŋ āĻāĻ•āĻŸāĻŋ āĻĒā§āĻ°āĻļā§āĻ¨ā§‡ āĻāĻŽāĻ¨ āĻāĻ•āĻŸāĻŋ āĻĢāĻžāĻ‚āĻļāĻ¨ āĻĨāĻžāĻ•ā§‡ āĻ¯āĻž āĻ¸āĻŽāĻžāĻ¨ā§āĻ¤āĻ°āĻžāĻ˛ āĻ¨āĻŋāĻ°āĻžāĻĒāĻĻ āĻšāĻŋāĻ¸āĻžāĻŦā§‡ āĻšāĻŋāĻšā§āĻ¨āĻŋāĻ¤ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ āĻ¨āĻž, āĻ¤āĻŦā§‡ āĻāĻŸāĻŋ āĻāĻ•āĻ• āĻĨā§āĻ°ā§‡āĻĄā§‡āĻĄ āĻšāĻŦā§‡ā§ˇ
  • āĻ¸āĻŋāĻ°āĻŋāĻ¯āĻŧāĻžāĻ˛āĻžāĻ‡āĻœā§‡āĻŦāĻ˛ āĻ˛ā§‡āĻ¨āĻĻā§‡āĻ¨ āĻŦāĻŋāĻšā§āĻ›āĻŋāĻ¨ā§āĻ¨āĻ¤āĻž āĻ¸ā§āĻ¤āĻ° āĻ¸āĻŽāĻžāĻ¨ā§āĻ¤āĻ°āĻžāĻ˛ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ•āĻ°āĻŖ āĻ…āĻ•ā§āĻˇāĻŽ āĻ•āĻ°ā§‡āĨ¤

āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ° āĻĒāĻ°āĻŋāĻŦā§‡āĻļ

PostgreSQL āĻŦāĻŋāĻ•āĻžāĻļāĻ•āĻžāĻ°ā§€āĻ°āĻž TPC-H āĻŦā§‡āĻžā§āĻšāĻŽāĻžāĻ°ā§āĻ• āĻĒā§āĻ°āĻļā§āĻ¨ā§‡āĻ° āĻĒā§āĻ°āĻ¤āĻŋāĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻ¸āĻŽāĻ¯āĻŧ āĻ•āĻŽāĻžāĻ¨ā§‹āĻ° āĻšā§‡āĻˇā§āĻŸāĻž āĻ•āĻ°ā§‡āĻ›ā§‡āĨ¤ āĻŦā§‡āĻžā§āĻšāĻŽāĻžāĻ°ā§āĻ• āĻĄāĻžāĻ‰āĻ¨āĻ˛ā§‹āĻĄ āĻ•āĻ°ā§āĻ¨ āĻāĻŦāĻ‚ PostgreSQL āĻāĻ° āĻ¸āĻžāĻĨā§‡ āĻŽāĻžāĻ¨āĻŋāĻ¯āĻŧā§‡ āĻ¨āĻŋāĻ¨. āĻāĻŸāĻŋ TPC-H āĻŦā§‡āĻžā§āĻšāĻŽāĻžāĻ°ā§āĻ•ā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻ…āĻ¨āĻžāĻ¨ā§āĻˇā§āĻ āĻžāĻ¨āĻŋāĻ• āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° - āĻĄāĻžāĻŸāĻžāĻŦā§‡āĻ¸ āĻŦāĻž āĻšāĻžāĻ°ā§āĻĄāĻ“āĻ¯āĻŧā§āĻ¯āĻžāĻ° āĻ¤ā§āĻ˛āĻ¨āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ¨āĻ¯āĻŧāĨ¤

  1. āĻĄāĻžāĻ‰āĻ¨āĻ˛ā§‹āĻĄ āĻ•āĻ°ā§āĻ¨ TPC-H_Tools_v2.17.3.zip (āĻŦāĻž āĻ¨āĻ¤ā§āĻ¨ āĻ¸āĻ‚āĻ¸ā§āĻ•āĻ°āĻŖ) TPC āĻ…āĻĢāĻ¸āĻžāĻ‡āĻŸ āĻĨā§‡āĻ•ā§‡.
  2. makefile.suite āĻāĻ° āĻ¨āĻžāĻŽ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻ•āĻ°ā§‡ Makefile āĻ•āĻ°ā§āĻ¨ āĻāĻŦāĻ‚ āĻāĻ–āĻžāĻ¨ā§‡ āĻŦāĻ°ā§āĻŖāĻŋāĻ¤ āĻšāĻŋāĻ¸āĻžāĻŦā§‡ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻ•āĻ°ā§āĻ¨: https://github.com/tvondra/pg_tpch . āĻŽā§‡āĻ• āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āĻĻāĻŋāĻ¯āĻŧā§‡ āĻ•ā§‹āĻĄ āĻ•āĻŽā§āĻĒāĻžāĻ‡āĻ˛ āĻ•āĻ°ā§āĻ¨āĨ¤
  3. āĻĄā§‡āĻŸāĻž āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§āĻ¨: ./dbgen -s 10 āĻāĻ•āĻŸāĻŋ 23 āĻœāĻŋāĻŦāĻŋ āĻĄāĻžāĻŸāĻžāĻŦā§‡āĻ¸ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§‡āĨ¤ āĻ¸āĻŽāĻžāĻ¨ā§āĻ¤āĻ°āĻžāĻ˛ āĻāĻŦāĻ‚ āĻ…-āĻ¸āĻŽāĻžāĻ¨ā§āĻ¤āĻ°āĻžāĻ˛ āĻĒā§āĻ°āĻļā§āĻ¨ā§‡āĻ° āĻ•āĻ°ā§āĻŽāĻ•ā§āĻˇāĻŽāĻ¤āĻž āĻĒāĻžāĻ°ā§āĻĨāĻ•ā§āĻ¯ āĻĻā§‡āĻ–āĻ¤ā§‡ āĻāĻŸāĻŋ āĻ¯āĻĨā§‡āĻˇā§āĻŸāĨ¤
  4. āĻĢāĻžāĻ‡āĻ˛ āĻ•āĻ¨āĻ­āĻžāĻ°ā§āĻŸ āĻ•āĻ°ā§āĻ¨ tbl в csv Ņ for и sed.
  5. āĻ¸āĻ‚āĻ—ā§āĻ°āĻšāĻ¸ā§āĻĨāĻ˛ āĻ•ā§āĻ˛ā§‹āĻ¨ āĻ•āĻ°ā§āĻ¨ pg_tpch āĻāĻŦāĻ‚ āĻĢāĻžāĻ‡āĻ˛ āĻ•āĻĒāĻŋ āĻ•āĻ°ā§āĻ¨ csv в pg_tpch/dss/data.
  6. āĻāĻ•āĻŸāĻŋ āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āĻĻāĻŋāĻ¯āĻŧā§‡ āĻĒā§āĻ°āĻļā§āĻ¨ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§āĻ¨ qgen.
  7. āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āĻĻāĻŋāĻ¯āĻŧā§‡ āĻĄāĻžāĻŸāĻžāĻŦā§‡āĻ¸ā§‡ āĻĄā§‡āĻŸāĻž āĻ˛ā§‹āĻĄ āĻ•āĻ°ā§āĻ¨ ./tpch.sh.

āĻ¸āĻŽāĻžāĻ¨ā§āĻ¤āĻ°āĻžāĻ˛ āĻ•ā§āĻ°āĻŽāĻŋāĻ• āĻ¸ā§āĻ•ā§āĻ¯āĻžāĻ¨āĻŋāĻ‚

āĻāĻŸāĻŋ āĻ¸āĻŽāĻžāĻ¨ā§āĻ¤āĻ°āĻžāĻ˛ āĻĒāĻĄāĻŧāĻžāĻ° āĻ•āĻžāĻ°āĻŖā§‡ āĻĻā§āĻ°ā§āĻ¤āĻ¤āĻ° āĻšāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡, āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻĄā§‡āĻŸāĻž āĻ…āĻ¨ā§‡āĻ• CPU āĻ•ā§‹āĻ°ā§‡ āĻ›āĻĄāĻŧāĻŋāĻ¯āĻŧā§‡ āĻĨāĻžāĻ•āĻžāĻ° āĻ•āĻžāĻ°āĻŖā§‡āĨ¤ āĻ†āĻ§ā§āĻ¨āĻŋāĻ• āĻ…āĻĒāĻžāĻ°ā§‡āĻŸāĻŋāĻ‚ āĻ¸āĻŋāĻ¸ā§āĻŸā§‡āĻŽā§‡, PostgreSQL āĻĄā§‡āĻŸāĻž āĻĢāĻžāĻ‡āĻ˛āĻ—ā§āĻ˛āĻŋ āĻ­āĻžāĻ˛āĻ­āĻžāĻŦā§‡ āĻ•ā§āĻ¯āĻžāĻļā§‡ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧāĨ¤ āĻ¸āĻžāĻŽāĻ¨ā§‡ āĻĒāĻĄāĻŧāĻžāĻ° āĻ¸āĻžāĻĨā§‡ āĻ¸āĻžāĻĨā§‡, PG āĻĄā§‡āĻŽāĻ¨ āĻ…āĻ¨ā§āĻ°ā§‹āĻ§ā§‡āĻ° āĻšā§‡āĻ¯āĻŧā§‡ āĻ¸ā§āĻŸā§‹āĻ°ā§‡āĻœ āĻĨā§‡āĻ•ā§‡ āĻāĻ•āĻŸāĻŋ āĻŦāĻĄāĻŧ āĻŦā§āĻ˛āĻ• āĻĒāĻžāĻ“āĻ¯āĻŧāĻž āĻ¸āĻŽā§āĻ­āĻŦāĨ¤ āĻ…āĻ¤āĻāĻŦ, āĻ•ā§āĻ¯ā§‹āĻ¯āĻŧāĻžāĻ°ā§€ āĻ•āĻ°ā§āĻŽāĻ•ā§āĻˇāĻŽāĻ¤āĻž āĻĄāĻŋāĻ¸ā§āĻ• I/O āĻĻā§āĻŦāĻžāĻ°āĻž āĻ¸ā§€āĻŽāĻžāĻŦāĻĻā§āĻ§ āĻ¨āĻ¯āĻŧāĨ¤ āĻāĻŸāĻŋ āĻ¸āĻŋāĻĒāĻŋāĻ‡āĻ‰ āĻšāĻ•ā§āĻ° āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡:

  • āĻŸā§‡āĻŦāĻŋāĻ˛ āĻĒā§ƒāĻˇā§āĻ āĻž āĻĨā§‡āĻ•ā§‡ āĻāĻ• āĻ¸āĻŽāĻ¯āĻŧā§‡ āĻ¸āĻžāĻ°āĻŋ āĻĒāĻĄāĻŧā§āĻ¨;
  • āĻ¸ā§āĻŸā§āĻ°āĻŋāĻ‚ āĻŽāĻžāĻ¨ āĻāĻŦāĻ‚ āĻļāĻ°ā§āĻ¤ āĻ¤ā§āĻ˛āĻ¨āĻž āĻ•āĻ°ā§āĻ¨ WHERE.

āĻāĻ° āĻāĻ•āĻŸāĻŋ āĻ¸āĻšāĻœ āĻĒā§āĻ°āĻļā§āĻ¨ āĻšāĻžāĻ˛āĻžāĻ¨ā§‹ āĻ¯āĻžāĻ• select:

tpch=# explain analyze select l_quantity as sum_qty from lineitem where l_shipdate <= date '1998-12-01' - interval '105' day;
QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------
Seq Scan on lineitem (cost=0.00..1964772.00 rows=58856235 width=5) (actual time=0.014..16951.669 rows=58839715 loops=1)
Filter: (l_shipdate <= '1998-08-18 00:00:00'::timestamp without time zone)
Rows Removed by Filter: 1146337
Planning Time: 0.203 ms
Execution Time: 19035.100 ms

āĻ•ā§āĻ°āĻŽāĻŋāĻ• āĻ¸ā§āĻ•ā§āĻ¯āĻžāĻ¨āĻŸāĻŋ āĻāĻ•āĻ¤ā§āĻ°ā§€āĻ•āĻ°āĻŖ āĻ›āĻžāĻĄāĻŧāĻžāĻ‡ āĻ…āĻ¨ā§‡āĻ•āĻ—ā§āĻ˛āĻŋ āĻ¸āĻžāĻ°āĻŋ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§‡, āĻ¤āĻžāĻ‡ āĻ•ā§āĻ¯ā§‹āĻ¯āĻŧāĻžāĻ°ā§€āĻŸāĻŋ āĻāĻ•āĻŸāĻŋ āĻāĻ•āĻ• CPU āĻ•ā§‹āĻ° āĻĻā§āĻŦāĻžāĻ°āĻž āĻ•āĻžāĻ°ā§āĻ¯āĻ•āĻ° āĻ•āĻ°āĻž āĻšāĻ¯āĻŧāĨ¤

āĻ¯āĻĻāĻŋ āĻ†āĻĒāĻ¨āĻŋ āĻ¯ā§‹āĻ— āĻ•āĻ°ā§‡āĻ¨ SUM(), āĻ†āĻĒāĻ¨āĻŋ āĻĻā§‡āĻ–āĻ¤ā§‡ āĻĒāĻžāĻšā§āĻ›ā§‡āĻ¨ āĻ¯ā§‡ āĻĻā§āĻŸāĻŋ āĻ•āĻ°ā§āĻŽāĻĒā§āĻ°āĻŦāĻžāĻš āĻ•ā§‹āĻ¯āĻŧā§‡āĻ°āĻŋāĻ° āĻ—āĻ¤āĻŋ āĻŦāĻžāĻĄāĻŧāĻžāĻ¤ā§‡ āĻ¸āĻžāĻšāĻžāĻ¯ā§āĻ¯ āĻ•āĻ°āĻŦā§‡:

explain analyze select sum(l_quantity) as sum_qty from lineitem where l_shipdate <= date '1998-12-01' - interval '105' day;
QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------------------------------
Finalize Aggregate (cost=1589702.14..1589702.15 rows=1 width=32) (actual time=8553.365..8553.365 rows=1 loops=1)
-> Gather (cost=1589701.91..1589702.12 rows=2 width=32) (actual time=8553.241..8555.067 rows=3 loops=1)
Workers Planned: 2
Workers Launched: 2
-> Partial Aggregate (cost=1588701.91..1588701.92 rows=1 width=32) (actual time=8547.546..8547.546 rows=1 loops=3)
-> Parallel Seq Scan on lineitem (cost=0.00..1527393.33 rows=24523431 width=5) (actual time=0.038..5998.417 rows=19613238 loops=3)
Filter: (l_shipdate <= '1998-08-18 00:00:00'::timestamp without time zone)
Rows Removed by Filter: 382112
Planning Time: 0.241 ms
Execution Time: 8555.131 ms

āĻ¸āĻŽāĻžāĻ¨ā§āĻ¤āĻ°āĻžāĻ˛ āĻ¸āĻŽāĻˇā§āĻŸāĻŋ

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

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

āĻ•āĻ°ā§āĻŽā§€ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ° āĻ¸āĻ‚āĻ–ā§āĻ¯āĻž

āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ° āĻĒā§āĻ¨āĻ°āĻžāĻ¯āĻŧ āĻšāĻžāĻ˛ā§ āĻ¨āĻž āĻ•āĻ°ā§‡āĻ‡ āĻ•āĻ°ā§āĻŽā§€ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ° āĻ¸āĻ‚āĻ–ā§āĻ¯āĻž āĻŦāĻžāĻĄāĻŧāĻžāĻ¨ā§‹ āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡:

explain analyze select sum(l_quantity) as sum_qty from lineitem where l_shipdate <= date '1998-12-01' - interval '105' day;
QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------------------------------
Finalize Aggregate (cost=1589702.14..1589702.15 rows=1 width=32) (actual time=8553.365..8553.365 rows=1 loops=1)
-> Gather (cost=1589701.91..1589702.12 rows=2 width=32) (actual time=8553.241..8555.067 rows=3 loops=1)
Workers Planned: 2
Workers Launched: 2
-> Partial Aggregate (cost=1588701.91..1588701.92 rows=1 width=32) (actual time=8547.546..8547.546 rows=1 loops=3)
-> Parallel Seq Scan on lineitem (cost=0.00..1527393.33 rows=24523431 width=5) (actual time=0.038..5998.417 rows=19613238 loops=3)
Filter: (l_shipdate <= '1998-08-18 00:00:00'::timestamp without time zone)
Rows Removed by Filter: 382112
Planning Time: 0.241 ms
Execution Time: 8555.131 ms

āĻāĻ–āĻžāĻ¨ā§‡ āĻ•āĻŋ āĻšāĻšā§āĻ›ā§‡? 2 āĻ—ā§āĻŖ āĻŦā§‡āĻļāĻŋ āĻ•āĻžāĻœā§‡āĻ° āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻ›āĻŋāĻ˛, āĻāĻŦāĻ‚ āĻ…āĻ¨ā§āĻ°ā§‹āĻ§āĻŸāĻŋ āĻŽāĻžāĻ¤ā§āĻ° 1,6599 āĻ—ā§āĻŖ āĻĻā§āĻ°ā§āĻ¤āĻ¤āĻ° āĻšāĻ¯āĻŧā§‡āĻ›ā§‡āĨ¤ āĻšāĻŋāĻ¸āĻžāĻŦ āĻ•ā§ŒāĻ¤ā§‚āĻšāĻ˛ā§‹āĻĻā§āĻĻā§€āĻĒāĻ•āĨ¤ āĻ†āĻŽāĻžāĻĻā§‡āĻ° 2 āĻœāĻ¨ āĻ•āĻ°ā§āĻŽā§€ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻāĻŦāĻ‚ 1 āĻœāĻ¨ āĻ¨ā§‡āĻ¤āĻž āĻ›āĻŋāĻ˛āĨ¤ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ā§‡āĻ° āĻĒāĻ° āĻāĻŸāĻŋ 4+1 āĻšāĻ¯āĻŧā§‡ āĻ—ā§‡āĻ˛āĨ¤

āĻ¸āĻŽāĻžāĻ¨ā§āĻ¤āĻ°āĻžāĻ˛ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ•āĻ°āĻŖ āĻĨā§‡āĻ•ā§‡ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ¸āĻ°ā§āĻŦā§‹āĻšā§āĻš āĻ—āĻ¤āĻŋ: 5/3 = 1,66(6) āĻŦāĻžāĻ°āĨ¤

āĻāĻŸāĻž āĻ•āĻŋāĻ­āĻžāĻŦā§‡ āĻ•āĻžāĻœ āĻ•āĻ°ā§‡?

āĻĒā§āĻ°āĻ¸ā§‡āĻ¸

āĻ…āĻ¨ā§āĻ°ā§‹āĻ§ āĻ¸āĻŽā§āĻĒāĻžāĻĻāĻ¨ āĻ¸āĻ°ā§āĻŦāĻĻāĻž āĻ…āĻ—ā§āĻ°āĻŖā§€ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻĻāĻŋāĻ¯āĻŧā§‡ āĻļā§āĻ°ā§ āĻšāĻ¯āĻŧāĨ¤ āĻ¨ā§‡āĻ¤āĻž āĻ¸āĻŦāĻ•āĻŋāĻ›ā§ āĻ…-āĻ¸āĻŽāĻžāĻ¨ā§āĻ¤āĻ°āĻžāĻ˛ āĻāĻŦāĻ‚ āĻ•āĻŋāĻ›ā§ āĻ¸āĻŽāĻžāĻ¨ā§āĻ¤āĻ°āĻžāĻ˛ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ•āĻ°āĻŖ āĻ•āĻ°ā§‡āĨ¤ āĻāĻ•āĻ‡ āĻ…āĻ¨ā§āĻ°ā§‹āĻ§āĻ—ā§āĻ˛āĻŋ āĻ¸āĻŽā§āĻĒāĻžāĻĻāĻ¨ āĻ•āĻ°ā§‡ āĻāĻŽāĻ¨ āĻ…āĻ¨ā§āĻ¯āĻžāĻ¨ā§āĻ¯ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ—ā§āĻ˛āĻŋāĻ•ā§‡ āĻ•āĻ°ā§āĻŽā§€ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻŦāĻ˛āĻž āĻšāĻ¯āĻŧāĨ¤ āĻ¸āĻŽāĻžāĻ¨ā§āĻ¤āĻ°āĻžāĻ˛ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ•āĻ°āĻŖ āĻ…āĻŦāĻ•āĻžāĻ āĻžāĻŽā§‹ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻ—āĻ¤āĻŋāĻļā§€āĻ˛ āĻŦā§āĻ¯āĻžāĻ•āĻ—ā§āĻ°āĻžāĻ‰āĻ¨ā§āĻĄ āĻ•āĻ°ā§āĻŽā§€ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž (āĻ¸āĻ‚āĻ¸ā§āĻ•āĻ°āĻŖ 9.4 āĻĨā§‡āĻ•ā§‡)āĨ¤ āĻ¯ā§‡āĻšā§‡āĻ¤ā§ PostgreSQL-āĻāĻ° āĻ…āĻ¨ā§āĻ¯āĻžāĻ¨ā§āĻ¯ āĻ…āĻ‚āĻļ āĻĨā§āĻ°ā§‡āĻĄā§‡āĻ° āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤ā§‡ āĻĒā§āĻ°āĻ¸ā§‡āĻ¸ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡, āĻ¤āĻžāĻ‡ 3 āĻ•āĻ°ā§āĻŽā§€ āĻĒā§āĻ°āĻ¸ā§‡āĻ¸ āĻ¸āĻš āĻāĻ•āĻŸāĻŋ āĻ•ā§āĻ¯ā§‹āĻ¯āĻŧāĻžāĻ°ā§€ āĻĒā§āĻ°āĻĨāĻžāĻ—āĻ¤ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ•āĻ°āĻŖā§‡āĻ° āĻšā§‡āĻ¯āĻŧā§‡ 4 āĻ—ā§āĻŖ āĻĻā§āĻ°ā§āĻ¤ āĻšāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤

āĻŽāĻŋāĻĨāĻˇā§āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž

āĻ•āĻ°ā§āĻŽā§€ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ—ā§āĻ˛āĻŋ āĻāĻ•āĻŸāĻŋ āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻ¸āĻžāĻ°āĻŋāĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡ āĻ¨ā§‡āĻ¤āĻžāĻ° āĻ¸āĻžāĻĨā§‡ āĻ¯ā§‹āĻ—āĻžāĻ¯ā§‹āĻ— āĻ•āĻ°ā§‡ (āĻļā§‡āĻ¯āĻŧāĻžāĻ° āĻ•āĻ°āĻž āĻŽā§‡āĻŽāĻ°āĻŋāĻ° āĻ‰āĻĒāĻ° āĻ­āĻŋāĻ¤ā§āĻ¤āĻŋ āĻ•āĻ°ā§‡)āĨ¤ āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ° 2āĻŸāĻŋ āĻ¸āĻžāĻ°āĻŋ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡: āĻ¤ā§āĻ°ā§āĻŸāĻŋāĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻŦāĻ‚ āĻŸāĻŋāĻĒāĻ˛ā§‡āĻ° āĻœāĻ¨ā§āĻ¯āĨ¤

āĻ•āĻ¤ āĻ•āĻ°ā§āĻŽāĻĒā§āĻ°āĻŦāĻžāĻš āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨?

āĻ¸āĻ°ā§āĻŦāĻ¨āĻŋāĻŽā§āĻ¨ āĻ¸ā§€āĻŽāĻž āĻĒāĻ°āĻžāĻŽāĻŋāĻ¤āĻŋ āĻĻā§āĻŦāĻžāĻ°āĻž āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ max_parallel_workers_per_gather. āĻ…āĻ¨ā§āĻ°ā§‹āĻ§ āĻ°āĻžāĻ¨āĻžāĻ° āĻ¤āĻžāĻ°āĻĒāĻ° āĻĒā§āĻ¯āĻžāĻ°āĻžāĻŽāĻŋāĻŸāĻžāĻ° āĻĻā§āĻŦāĻžāĻ°āĻž āĻ¸ā§€āĻŽāĻŋāĻ¤ āĻĒā§āĻ˛ āĻĨā§‡āĻ•ā§‡ āĻ•āĻ°ā§āĻŽā§€ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻ¨ā§‡āĻ¯āĻŧ max_parallel_workers size. āĻļā§‡āĻˇ āĻ¸ā§€āĻŽāĻžāĻŦāĻĻā§āĻ§āĻ¤āĻž āĻšāĻ˛ max_worker_processes, āĻ…āĻ°ā§āĻĨāĻžā§Ž, āĻĒāĻŸāĻ­ā§‚āĻŽāĻŋ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ° āĻŽā§‹āĻŸ āĻ¸āĻ‚āĻ–ā§āĻ¯āĻžāĨ¤

āĻ¯āĻĻāĻŋ āĻ•āĻ°ā§āĻŽā§€ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻŦāĻ°āĻžāĻĻā§āĻĻ āĻ•āĻ°āĻž āĻ¸āĻŽā§āĻ­āĻŦ āĻ¨āĻž āĻšāĻ¯āĻŧ āĻ¤āĻŦā§‡ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ•āĻ°āĻŖ āĻšāĻŦā§‡ āĻāĻ•āĻ•-āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĨ¤

āĻ•ā§āĻ¯ā§‹āĻ¯āĻŧāĻžāĻ°ā§€ āĻĒā§āĻ˛ā§āĻ¯āĻžāĻ¨āĻžāĻ° āĻŸā§‡āĻŦāĻŋāĻ˛ āĻŦāĻž āĻ¸ā§‚āĻšāĻ•ā§‡āĻ° āĻ†āĻ•āĻžāĻ°ā§‡āĻ° āĻ‰āĻĒāĻ° āĻ¨āĻŋāĻ°ā§āĻ­āĻ° āĻ•āĻ°ā§‡ āĻ•āĻ°ā§āĻŽāĻĒā§āĻ°āĻŦāĻžāĻš āĻ•āĻŽāĻžāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤ āĻāĻ‡ āĻœāĻ¨ā§āĻ¯ āĻĒāĻ°āĻžāĻŽāĻŋāĻ¤āĻŋ āĻ†āĻ›ā§‡ min_parallel_table_scan_size и min_parallel_index_scan_size.

set min_parallel_table_scan_size='8MB'
8MB table => 1 worker
24MB table => 2 workers
72MB table => 3 workers
x => log(x / min_parallel_table_scan_size) / log(3) + 1 worker

āĻĒā§āĻ°āĻ¤āĻŋāĻŦāĻžāĻ° āĻŸā§‡āĻŦāĻŋāĻ˛ā§‡āĻ° āĻšā§‡āĻ¯āĻŧā§‡ 3 āĻ—ā§āĻŖ āĻŦāĻĄāĻŧ min_parallel_(index|table)_scan_size, Postgres āĻāĻ•āĻŸāĻŋ āĻ•āĻ°ā§āĻŽā§€ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻ¯ā§‹āĻ— āĻ•āĻ°ā§‡āĨ¤ āĻ•āĻ°ā§āĻŽāĻĒā§āĻ°āĻŦāĻžāĻšā§‡āĻ° āĻ¸āĻ‚āĻ–ā§āĻ¯āĻž āĻ–āĻ°āĻšā§‡āĻ° āĻ‰āĻĒāĻ° āĻ­āĻŋāĻ¤ā§āĻ¤āĻŋ āĻ•āĻ°ā§‡ āĻ¨āĻ¯āĻŧāĨ¤ āĻ¸āĻžāĻ°ā§āĻ•ā§āĻ˛āĻžāĻ° āĻ¨āĻŋāĻ°ā§āĻ­āĻ°āĻ¤āĻž āĻœāĻŸāĻŋāĻ˛ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨āĻ•ā§‡ āĻ•āĻ āĻŋāĻ¨ āĻ•āĻ°ā§‡ āĻ¤ā§‹āĻ˛ā§‡āĨ¤ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤ā§‡, āĻĒāĻ°āĻŋāĻ•āĻ˛ā§āĻĒāĻ¨āĻžāĻ•āĻžāĻ°ā§€ āĻ¸āĻšāĻœ āĻ¨āĻŋāĻ¯āĻŧāĻŽ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡āĨ¤

āĻ…āĻ¨ā§āĻļā§€āĻ˛āĻ¨ā§‡, āĻāĻ‡ āĻ¨āĻŋāĻ¯āĻŧāĻŽāĻ—ā§āĻ˛āĻŋ āĻ¸āĻ°ā§āĻŦāĻĻāĻž āĻ‰āĻ¤ā§āĻĒāĻžāĻĻāĻ¨ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ‰āĻĒāĻ¯ā§āĻ•ā§āĻ¤ āĻ¨āĻ¯āĻŧ, āĻ¤āĻžāĻ‡ āĻ†āĻĒāĻ¨āĻŋ āĻāĻ•āĻŸāĻŋ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻŸā§‡āĻŦāĻŋāĻ˛ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ•āĻ°ā§āĻŽā§€ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ° āĻ¸āĻ‚āĻ–ā§āĻ¯āĻž āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨: ALTER TABLE ... SET (parallel_workers = N).

āĻ•ā§‡āĻ¨ āĻ¸āĻŽāĻžāĻ¨ā§āĻ¤āĻ°āĻžāĻ˛ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ•āĻ°āĻŖ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ āĻ¨āĻž?

āĻŦāĻŋāĻ§āĻŋāĻ¨āĻŋāĻˇā§‡āĻ§ā§‡āĻ° āĻĻā§€āĻ°ā§āĻ˜ āĻ¤āĻžāĻ˛āĻŋāĻ•āĻž āĻ›āĻžāĻĄāĻŧāĻžāĻ“, āĻ–āĻ°āĻš āĻšā§‡āĻ•āĻ“ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡:

parallel_setup_cost - āĻ¸āĻ‚āĻ•ā§āĻˇāĻŋāĻĒā§āĻ¤ āĻ…āĻ¨ā§āĻ°ā§‹āĻ§ā§‡āĻ° āĻ¸āĻŽāĻžāĻ¨ā§āĻ¤āĻ°āĻžāĻ˛ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ•āĻ°āĻŖ āĻāĻĄāĻŧāĻžāĻ¤ā§‡āĨ¤ āĻāĻ‡ āĻĒā§āĻ¯āĻžāĻ°āĻžāĻŽāĻŋāĻŸāĻžāĻ°āĻŸāĻŋ āĻŽā§‡āĻŽāĻ°āĻŋ āĻĒā§āĻ°āĻ¸ā§āĻ¤ā§āĻ¤ āĻ•āĻ°āĻžāĻ°, āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻļā§āĻ°ā§ āĻ•āĻ°āĻžāĻ° āĻāĻŦāĻ‚ āĻĒā§āĻ°āĻžāĻĨāĻŽāĻŋāĻ• āĻĄā§‡āĻŸāĻž āĻŦāĻŋāĻ¨āĻŋāĻŽāĻ¯āĻŧā§‡āĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻ…āĻ¨ā§āĻŽāĻžāĻ¨ āĻ•āĻ°ā§‡āĨ¤

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

āĻ¨ā§‡āĻ¸ā§āĻŸā§‡āĻĄ āĻ˛ā§āĻĒ āĻ¯ā§‹āĻ—āĻĻāĻžāĻ¨ āĻ•āĻ°ā§‡

PostgreSQL 9.6+ ĐŧĐžĐļĐĩŅ‚ вŅ‹ĐŋĐžĐģĐŊŅŅ‚ŅŒ вĐģĐžĐļĐĩĐŊĐŊŅ‹Đĩ Ņ†Đ¸ĐēĐģŅ‹ ĐŋĐ°Ņ€Đ°ĐģĐģĐĩĐģŅŒĐŊĐž — ŅŅ‚Đž ĐŋŅ€ĐžŅŅ‚Đ°Ņ ĐžĐŋĐĩŅ€Đ°Ņ†Đ¸Ņ.

explain (costs off) select c_custkey, count(o_orderkey)
                from    customer left outer join orders on
                                c_custkey = o_custkey and o_comment not like '%special%deposits%'
                group by c_custkey;
                                      QUERY PLAN
--------------------------------------------------------------------------------------
 Finalize GroupAggregate
   Group Key: customer.c_custkey
   ->  Gather Merge
         Workers Planned: 4
         ->  Partial GroupAggregate
               Group Key: customer.c_custkey
               ->  Nested Loop Left Join
                     ->  Parallel Index Only Scan using customer_pkey on customer
                     ->  Index Scan using idx_orders_custkey on orders
                           Index Cond: (customer.c_custkey = o_custkey)
                           Filter: ((o_comment)::text !~~ '%special%deposits%'::text)

āĻ¸āĻ‚āĻ—ā§āĻ°āĻš āĻļā§‡āĻˇ āĻĒāĻ°ā§āĻ¯āĻžāĻ¯āĻŧā§‡ āĻ˜āĻŸā§‡, āĻ¤āĻžāĻ‡ āĻ¨ā§‡āĻ¸ā§āĻŸā§‡āĻĄ āĻ˛ā§āĻĒ āĻŦāĻžāĻŽ āĻ¯ā§‹āĻ— āĻāĻ•āĻŸāĻŋ āĻ¸āĻŽāĻžāĻ¨ā§āĻ¤āĻ°āĻžāĻ˛ āĻ…āĻĒāĻžāĻ°ā§‡āĻļāĻ¨āĨ¤ āĻĒā§āĻ¯āĻžāĻ°āĻžāĻ˛āĻžāĻ˛ āĻ‡āĻ¨āĻĄā§‡āĻ•ā§āĻ¸ āĻ…āĻ¨āĻ˛āĻŋ āĻ¸ā§āĻ•ā§āĻ¯āĻžāĻ¨ āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° 10 āĻ¸āĻ‚āĻ¸ā§āĻ•āĻ°āĻŖā§‡ āĻšāĻžāĻ˛ā§ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›āĻŋāĻ˛āĨ¤ āĻāĻŸāĻŋ āĻ¸āĻŽāĻžāĻ¨ā§āĻ¤āĻ°āĻžāĻ˛ āĻ¸āĻŋāĻ°āĻŋāĻ¯āĻŧāĻžāĻ˛ āĻ¸ā§āĻ•ā§āĻ¯āĻžāĻ¨āĻŋāĻ‚āĻ¯āĻŧā§‡āĻ° āĻŽāĻ¤ā§‹āĻ‡ āĻ•āĻžāĻœ āĻ•āĻ°ā§‡āĨ¤ āĻ…āĻŦāĻ¸ā§āĻĨāĻž c_custkey = o_custkey āĻ•ā§āĻ˛āĻžāĻ¯āĻŧā§‡āĻ¨ā§āĻŸ āĻ¸ā§āĻŸā§āĻ°āĻŋāĻ‚ āĻĒā§āĻ°āĻ¤āĻŋ āĻāĻ•āĻŸāĻŋ āĻ…āĻ°ā§āĻĄāĻžāĻ° āĻĒāĻĄāĻŧā§‡āĨ¤ āĻ¤āĻžāĻ‡ āĻāĻŸāĻž āĻ¸āĻŽāĻžāĻ¨ā§āĻ¤āĻ°āĻžāĻ˛ āĻ¨āĻž.

āĻšā§āĻ¯āĻžāĻļ āĻ¯ā§‹āĻ—āĻĻāĻžāĻ¨

āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻ•āĻ°ā§āĻŽā§€ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž PostgreSQL 11 āĻĒāĻ°ā§āĻ¯āĻ¨ā§āĻ¤ āĻ¨āĻŋāĻœāĻ¸ā§āĻŦ āĻšā§āĻ¯āĻžāĻļ āĻŸā§‡āĻŦāĻŋāĻ˛ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§‡āĨ¤ āĻāĻŦāĻ‚ āĻ¯āĻĻāĻŋ āĻāĻ‡ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ—ā§āĻ˛āĻŋāĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻšāĻžāĻ°āĻŸāĻŋāĻ° āĻŦā§‡āĻļāĻŋ āĻĨāĻžāĻ•ā§‡, āĻ•āĻ°ā§āĻŽāĻ•ā§āĻˇāĻŽāĻ¤āĻž āĻ‰āĻ¨ā§āĻ¨āĻ¤ āĻšāĻŦā§‡ āĻ¨āĻžāĨ¤ āĻ¨āĻ¤ā§āĻ¨ āĻ¸āĻ‚āĻ¸ā§āĻ•āĻ°āĻŖā§‡, āĻšā§āĻ¯āĻžāĻļ āĻŸā§‡āĻŦāĻŋāĻ˛ āĻ­āĻžāĻ— āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ. āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻ•āĻ°ā§āĻŽā§€ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻāĻ•āĻŸāĻŋ āĻšā§āĻ¯āĻžāĻļ āĻŸā§‡āĻŦāĻŋāĻ˛ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻ¤ā§‡ WORK_MEM āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤

select
        l_shipmode,
        sum(case
                when o_orderpriority = '1-URGENT'
                        or o_orderpriority = '2-HIGH'
                        then 1
                else 0
        end) as high_line_count,
        sum(case
                when o_orderpriority <> '1-URGENT'
                        and o_orderpriority <> '2-HIGH'
                        then 1
                else 0
        end) as low_line_count
from
        orders,
        lineitem
where
        o_orderkey = l_orderkey
        and l_shipmode in ('MAIL', 'AIR')
        and l_commitdate < l_receiptdate
        and l_shipdate < l_commitdate
        and l_receiptdate >= date '1996-01-01'
        and l_receiptdate < date '1996-01-01' + interval '1' year
group by
        l_shipmode
order by
        l_shipmode
LIMIT 1;
                                                                                                                                    QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Limit  (cost=1964755.66..1964961.44 rows=1 width=27) (actual time=7579.592..7922.997 rows=1 loops=1)
   ->  Finalize GroupAggregate  (cost=1964755.66..1966196.11 rows=7 width=27) (actual time=7579.590..7579.591 rows=1 loops=1)
         Group Key: lineitem.l_shipmode
         ->  Gather Merge  (cost=1964755.66..1966195.83 rows=28 width=27) (actual time=7559.593..7922.319 rows=6 loops=1)
               Workers Planned: 4
               Workers Launched: 4
               ->  Partial GroupAggregate  (cost=1963755.61..1965192.44 rows=7 width=27) (actual time=7548.103..7564.592 rows=2 loops=5)
                     Group Key: lineitem.l_shipmode
                     ->  Sort  (cost=1963755.61..1963935.20 rows=71838 width=27) (actual time=7530.280..7539.688 rows=62519 loops=5)
                           Sort Key: lineitem.l_shipmode
                           Sort Method: external merge  Disk: 2304kB
                           Worker 0:  Sort Method: external merge  Disk: 2064kB
                           Worker 1:  Sort Method: external merge  Disk: 2384kB
                           Worker 2:  Sort Method: external merge  Disk: 2264kB
                           Worker 3:  Sort Method: external merge  Disk: 2336kB
                           ->  Parallel Hash Join  (cost=382571.01..1957960.99 rows=71838 width=27) (actual time=7036.917..7499.692 rows=62519 loops=5)
                                 Hash Cond: (lineitem.l_orderkey = orders.o_orderkey)
                                 ->  Parallel Seq Scan on lineitem  (cost=0.00..1552386.40 rows=71838 width=19) (actual time=0.583..4901.063 rows=62519 loops=5)
                                       Filter: ((l_shipmode = ANY ('{MAIL,AIR}'::bpchar[])) AND (l_commitdate < l_receiptdate) AND (l_shipdate < l_commitdate) AND (l_receiptdate >= '1996-01-01'::date) AND (l_receiptdate < '1997-01-01 00:00:00'::timestamp without time zone))
                                       Rows Removed by Filter: 11934691
                                 ->  Parallel Hash  (cost=313722.45..313722.45 rows=3750045 width=20) (actual time=2011.518..2011.518 rows=3000000 loops=5)
                                       Buckets: 65536  Batches: 256  Memory Usage: 3840kB
                                       ->  Parallel Seq Scan on orders  (cost=0.00..313722.45 rows=3750045 width=20) (actual time=0.029..995.948 rows=3000000 loops=5)
 Planning Time: 0.977 ms
 Execution Time: 7923.770 ms

TPC-H āĻĨā§‡āĻ•ā§‡ āĻĒā§āĻ°āĻļā§āĻ¨ 12 āĻ¸ā§āĻĒāĻˇā§āĻŸāĻ­āĻžāĻŦā§‡ āĻāĻ•āĻŸāĻŋ āĻ¸āĻŽāĻžāĻ¨ā§āĻ¤āĻ°āĻžāĻ˛ āĻšā§āĻ¯āĻžāĻļ āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻĻā§‡āĻ–āĻžāĻ¯āĻŧāĨ¤ āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻ•āĻ°ā§āĻŽā§€ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻāĻ•āĻŸāĻŋ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ āĻšā§āĻ¯āĻžāĻļ āĻŸā§‡āĻŦāĻŋāĻ˛ āĻ¤ā§ˆāĻ°āĻŋāĻ¤ā§‡ āĻ…āĻŦāĻĻāĻžāĻ¨ āĻ°āĻžāĻ–ā§‡āĨ¤

āĻ¯ā§‹āĻ—āĻĻāĻžāĻ¨ āĻāĻ•āĻ¤ā§āĻ°āĻŋāĻ¤ āĻ•āĻ°ā§āĻ¨

āĻāĻ•āĻŸāĻŋ āĻŽāĻžāĻ°ā§āĻœ āĻ¯ā§‹āĻ— āĻĒā§āĻ°āĻ•ā§ƒāĻ¤āĻŋāĻ¤ā§‡ āĻ…-āĻ¸āĻŽāĻžāĻ¨ā§āĻ¤āĻ°āĻžāĻ˛āĨ¤ āĻšāĻŋāĻ¨ā§āĻ¤āĻž āĻ•āĻ°āĻŦā§‡āĻ¨ āĻ¨āĻž āĻ¯āĻĻāĻŋ āĻāĻŸāĻŋ āĻĒā§āĻ°āĻļā§āĻ¨ā§‡āĻ° āĻļā§‡āĻˇ āĻ§āĻžāĻĒ āĻšāĻ¯āĻŧ - āĻāĻŸāĻŋ āĻāĻ–āĻ¨āĻ“ āĻ¸āĻŽāĻžāĻ¨ā§āĻ¤āĻ°āĻžāĻ˛āĻ­āĻžāĻŦā§‡ āĻšāĻ˛āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤

-- Query 2 from TPC-H
explain (costs off) select s_acctbal, s_name, n_name, p_partkey, p_mfgr, s_address, s_phone, s_comment
from    part, supplier, partsupp, nation, region
where
        p_partkey = ps_partkey
        and s_suppkey = ps_suppkey
        and p_size = 36
        and p_type like '%BRASS'
        and s_nationkey = n_nationkey
        and n_regionkey = r_regionkey
        and r_name = 'AMERICA'
        and ps_supplycost = (
                select
                        min(ps_supplycost)
                from    partsupp, supplier, nation, region
                where
                        p_partkey = ps_partkey
                        and s_suppkey = ps_suppkey
                        and s_nationkey = n_nationkey
                        and n_regionkey = r_regionkey
                        and r_name = 'AMERICA'
        )
order by s_acctbal desc, n_name, s_name, p_partkey
LIMIT 100;
                                                QUERY PLAN
----------------------------------------------------------------------------------------------------------
 Limit
   ->  Sort
         Sort Key: supplier.s_acctbal DESC, nation.n_name, supplier.s_name, part.p_partkey
         ->  Merge Join
               Merge Cond: (part.p_partkey = partsupp.ps_partkey)
               Join Filter: (partsupp.ps_supplycost = (SubPlan 1))
               ->  Gather Merge
                     Workers Planned: 4
                     ->  Parallel Index Scan using <strong>part_pkey</strong> on part
                           Filter: (((p_type)::text ~~ '%BRASS'::text) AND (p_size = 36))
               ->  Materialize
                     ->  Sort
                           Sort Key: partsupp.ps_partkey
                           ->  Nested Loop
                                 ->  Nested Loop
                                       Join Filter: (nation.n_regionkey = region.r_regionkey)
                                       ->  Seq Scan on region
                                             Filter: (r_name = 'AMERICA'::bpchar)
                                       ->  Hash Join
                                             Hash Cond: (supplier.s_nationkey = nation.n_nationkey)
                                             ->  Seq Scan on supplier
                                             ->  Hash
                                                   ->  Seq Scan on nation
                                 ->  Index Scan using idx_partsupp_suppkey on partsupp
                                       Index Cond: (ps_suppkey = supplier.s_suppkey)
               SubPlan 1
                 ->  Aggregate
                       ->  Nested Loop
                             Join Filter: (nation_1.n_regionkey = region_1.r_regionkey)
                             ->  Seq Scan on region region_1
                                   Filter: (r_name = 'AMERICA'::bpchar)
                             ->  Nested Loop
                                   ->  Nested Loop
                                         ->  Index Scan using idx_partsupp_partkey on partsupp partsupp_1
                                               Index Cond: (part.p_partkey = ps_partkey)
                                         ->  Index Scan using supplier_pkey on supplier supplier_1
                                               Index Cond: (s_suppkey = partsupp_1.ps_suppkey)
                                   ->  Index Scan using nation_pkey on nation nation_1
                                         Index Cond: (n_nationkey = supplier_1.s_nationkey)

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

āĻŦāĻŋāĻ­āĻžāĻ— āĻĻā§āĻŦāĻžāĻ°āĻž āĻ¸āĻ‚āĻ¯ā§‹āĻ—

PostgreSQL 11-āĻ āĻŦāĻŋāĻ­āĻžāĻ— āĻĻā§āĻŦāĻžāĻ°āĻž āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻĄāĻŋāĻĢāĻ˛ā§āĻŸāĻ°ā§‚āĻĒā§‡ āĻ…āĻ•ā§āĻˇāĻŽ: āĻāĻŸāĻŋāĻ° āĻ–ā§āĻŦ āĻŦā§āĻ¯āĻ¯āĻŧāĻŦāĻšā§āĻ˛ āĻ¸āĻŽāĻ¯āĻŧāĻ¸ā§‚āĻšā§€ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡āĨ¤ āĻ…āĻ¨ā§āĻ°ā§‚āĻĒ āĻĒāĻžāĻ°ā§āĻŸāĻŋāĻļāĻ¨ āĻ¸āĻš āĻŸā§‡āĻŦāĻŋāĻ˛āĻ—ā§āĻ˛āĻŋāĻ•ā§‡ āĻĒāĻžāĻ°ā§āĻŸāĻŋāĻļāĻ¨ āĻĻā§āĻŦāĻžāĻ°āĻž āĻĒāĻžāĻ°ā§āĻŸāĻŋāĻļāĻ¨ā§‡ āĻ¯ā§āĻ•ā§āĻ¤ āĻ•āĻ°āĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤ āĻāĻ‡āĻ­āĻžāĻŦā§‡ āĻĒā§‹āĻ¸ā§āĻŸāĻ—ā§āĻ°ā§‡āĻ¸ āĻ›ā§‹āĻŸ āĻšā§āĻ¯āĻžāĻļ āĻŸā§‡āĻŦāĻŋāĻ˛ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻŦā§‡āĨ¤ āĻŦāĻŋāĻ­āĻžāĻ—āĻ—ā§āĻ˛āĻŋāĻ° āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻ¸āĻŽāĻžāĻ¨ā§āĻ¤āĻ°āĻžāĻ˛ āĻšāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤

tpch=# set enable_partitionwise_join=t;
tpch=# explain (costs off) select * from prt1 t1, prt2 t2
where t1.a = t2.b and t1.b = 0 and t2.b between 0 and 10000;
                    QUERY PLAN
---------------------------------------------------
 Append
   ->  Hash Join
         Hash Cond: (t2.b = t1.a)
         ->  Seq Scan on prt2_p1 t2
               Filter: ((b >= 0) AND (b <= 10000))
         ->  Hash
               ->  Seq Scan on prt1_p1 t1
                     Filter: (b = 0)
   ->  Hash Join
         Hash Cond: (t2_1.b = t1_1.a)
         ->  Seq Scan on prt2_p2 t2_1
               Filter: ((b >= 0) AND (b <= 10000))
         ->  Hash
               ->  Seq Scan on prt1_p2 t1_1
                     Filter: (b = 0)
tpch=# set parallel_setup_cost = 1;
tpch=# set parallel_tuple_cost = 0.01;
tpch=# explain (costs off) select * from prt1 t1, prt2 t2
where t1.a = t2.b and t1.b = 0 and t2.b between 0 and 10000;
                        QUERY PLAN
-----------------------------------------------------------
 Gather
   Workers Planned: 4
   ->  Parallel Append
         ->  Parallel Hash Join
               Hash Cond: (t2_1.b = t1_1.a)
               ->  Parallel Seq Scan on prt2_p2 t2_1
                     Filter: ((b >= 0) AND (b <= 10000))
               ->  Parallel Hash
                     ->  Parallel Seq Scan on prt1_p2 t1_1
                           Filter: (b = 0)
         ->  Parallel Hash Join
               Hash Cond: (t2.b = t1.a)
               ->  Parallel Seq Scan on prt2_p1 t2
                     Filter: ((b >= 0) AND (b <= 10000))
               ->  Parallel Hash
                     ->  Parallel Seq Scan on prt1_p1 t1
                           Filter: (b = 0)

āĻĒā§āĻ°āĻ§āĻžāĻ¨ āĻœāĻŋāĻ¨āĻŋāĻ¸ āĻšāĻ˛ āĻ¯ā§‡ āĻŦāĻŋāĻ­āĻžāĻ—āĻ—ā§āĻ˛āĻŋāĻ° āĻ¸āĻ‚āĻ¯ā§‹āĻ—āĻŸāĻŋ āĻ¸āĻŽāĻžāĻ¨ā§āĻ¤āĻ°āĻžāĻ˛ āĻšāĻ¯āĻŧ āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻ¯āĻĻāĻŋ āĻāĻ‡ āĻŦāĻŋāĻ­āĻžāĻ—āĻ—ā§āĻ˛āĻŋ āĻ¯āĻĨā§‡āĻˇā§āĻŸ āĻŦāĻĄāĻŧ āĻšāĻ¯āĻŧāĨ¤

āĻ¸āĻŽāĻžāĻ¨ā§āĻ¤āĻ°āĻžāĻ˛ āĻ¸āĻ‚āĻ¯ā§‹āĻœāĻ¨

āĻ¸āĻŽāĻžāĻ¨ā§āĻ¤āĻ°āĻžāĻ˛ āĻ¸āĻ‚āĻ¯ā§‹āĻœāĻ¨ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āĻ¨ āĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻ•āĻĢā§āĻ˛ā§‹āĻ¤ā§‡ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āĻ¨ āĻŦā§āĻ˛āĻ•ā§‡āĻ° āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤ā§‡ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤ āĻāĻŸāĻŋ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖāĻ¤ UNION āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻĒā§āĻ°āĻļā§āĻ¨ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ˜āĻŸā§‡āĨ¤ āĻ…āĻ¸ā§āĻŦāĻŋāĻ§āĻžāĻŸāĻŋ āĻ•āĻŽ āĻ¸āĻŽāĻžāĻ¨ā§āĻ¤āĻ°āĻžāĻ˛āĻ¤āĻž, āĻ•āĻžāĻ°āĻŖ āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻ•āĻ°ā§āĻŽā§€ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° 1āĻŸāĻŋ āĻ…āĻ¨ā§āĻ°ā§‹āĻ§ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻ•āĻ°ā§‡āĨ¤

āĻāĻ–āĻžāĻ¨ā§‡ 2āĻŸāĻŋ āĻ•āĻ°ā§āĻŽā§€ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻšāĻ˛āĻ›ā§‡, āĻ¯āĻĻāĻŋāĻ“ 4āĻŸāĻŋ āĻ¸āĻ•ā§āĻˇāĻŽā§ˇ

tpch=# explain (costs off) select sum(l_quantity) as sum_qty from lineitem where l_shipdate <= date '1998-12-01' - interval '105' day union all select sum(l_quantity) as sum_qty from lineitem where l_shipdate <= date '2000-12-01' - interval '105' day;
                                           QUERY PLAN
------------------------------------------------------------------------------------------------
 Gather
   Workers Planned: 2
   ->  Parallel Append
         ->  Aggregate
               ->  Seq Scan on lineitem
                     Filter: (l_shipdate <= '2000-08-18 00:00:00'::timestamp without time zone)
         ->  Aggregate
               ->  Seq Scan on lineitem lineitem_1
                     Filter: (l_shipdate <= '1998-08-18 00:00:00'::timestamp without time zone)

āĻ¸āĻŦāĻšā§‡āĻ¯āĻŧā§‡ āĻ—ā§āĻ°ā§āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖ āĻ­ā§‡āĻ°āĻŋāĻ¯āĻŧā§‡āĻŦāĻ˛

  • WORK_MEM āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻĒā§āĻ°āĻ¤āĻŋ āĻŽā§‡āĻŽāĻ°āĻŋ āĻ¸ā§€āĻŽāĻŋāĻ¤ āĻ•āĻ°ā§‡, āĻļā§āĻ§ā§ āĻĒā§āĻ°āĻļā§āĻ¨ āĻ¨āĻ¯āĻŧ: work_mem āĻĒā§āĻ°āĻ¸ā§‡āĻ¸ āĻ¸āĻ‚āĻ¯ā§‹āĻ— = āĻ…āĻ¨ā§‡āĻ• āĻŽā§‡āĻŽāĻ°āĻŋāĨ¤
  • max_parallel_workers_per_gather — āĻĒāĻ°āĻŋāĻ•āĻ˛ā§āĻĒāĻ¨āĻž āĻĨā§‡āĻ•ā§‡ āĻ¸āĻŽāĻžāĻ¨ā§āĻ¤āĻ°āĻžāĻ˛ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ•āĻ°āĻŖā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ¨āĻŋāĻ°ā§āĻŦāĻžāĻšāĻ•āĻžāĻ°ā§€ āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽ āĻ•āĻ¤āĻœāĻ¨ āĻ•āĻ°ā§āĻŽā§€ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻŦā§‡āĨ¤
  • max_worker_processes — āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°ā§‡ CPU āĻ•ā§‹āĻ°ā§‡āĻ° āĻ¸āĻ‚āĻ–ā§āĻ¯āĻžāĻ° āĻ¸āĻžāĻĨā§‡ āĻ•āĻ°ā§āĻŽā§€ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ° āĻŽā§‹āĻŸ āĻ¸āĻ‚āĻ–ā§āĻ¯āĻž āĻ¸āĻžāĻŽāĻžā§āĻœāĻ¸ā§āĻ¯ āĻ•āĻ°ā§‡āĨ¤
  • max_parallel_workers - āĻāĻ•āĻ‡, āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻ¸āĻŽāĻžāĻ¨ā§āĻ¤āĻ°āĻžāĻ˛ āĻ•āĻžāĻœā§‡āĻ° āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ° āĻœāĻ¨ā§āĻ¯āĨ¤

āĻĢāĻ˛āĻžāĻĢāĻ˛

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

āĻ°ā§‡āĻĢāĻžāĻ°ā§‡āĻ¨ā§āĻ¸

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

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