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

DDoS āϏ⧁āϰāĻ•ā§āώāĻž, VPS VDS āϏāĻžāĻ°ā§āĻ­āĻžāϰ āϏāĻš āϏāĻžāχāϟāϗ⧁āϞāĻŋāϰ āϜāĻ¨ā§āϝ āύāĻŋāĻ°ā§āĻ­āϰāϝ⧋āĻ—ā§āϝ āĻšā§‹āĻ¸ā§āϟāĻŋāĻ‚ āĻ•āĻŋāύ⧁āύ đŸ”Ĩ DDoS āϏ⧁āϰāĻ•ā§āώāĻž āϏāĻš āύāĻŋāĻ°ā§āĻ­āϰāϝ⧋āĻ—ā§āϝ āĻ“āϝāĻŧ⧇āĻŦāϏāĻžāχāϟ āĻšā§‹āĻ¸ā§āϟāĻŋāĻ‚ āĻ•āĻŋāύ⧁āύ, VPS VDS āϏāĻžāĻ°ā§āĻ­āĻžāϰ | ProHoster