PostgreSQL рдореЗрдВ рд╕рдорд╛рдирд╛рдВрддрд░ рдХреНрд╡реЗрд░реА


рдЖрдзреБрдирд┐рдХ рд╕реАрдкреАрдпреВ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХреЛрд░ рд╣реИрдВред рд╡рд░реНрд╖реЛрдВ рдХреЗ рд▓рд┐рдП, рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдиреЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдкреНрд░рд╢реНрди рднреЗрдЬреЗ рд╣реИрдВред рдпрджрд┐ рдпрд╣ рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдХрдИ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд░рд┐рдкреЛрд░реНрдЯрд┐рдВрдЧ рдХреНрд╡реЗрд░реА рд╣реИ, рддреЛ рдпрд╣ рддреЗрдЬреА рд╕реЗ рдЪрд▓рддрд╛ рд╣реИ рдЬрдм рдпрд╣ рдХрдИ рд╕реАрдкреАрдпреВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдФрд░ PostgreSQL рдореЗрдВ рд╕рдВрд╕реНрдХрд░рдг 9.6 рд╕реЗ рд╢реБрд░реВ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред


рд╕рдорд╛рдирд╛рдВрддрд░ рдХреНрд╡реЗрд░реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ 3 рд╕рд╛рд▓ рд▓рдЧ рдЧрдП - рдореБрдЭреЗ рдХреНрд╡реЗрд░реА рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдЪрд░рдгреЛрдВ рдореЗрдВ рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рдкрдбрд╝рд╛ред PostgreSQL 9.6 рдиреЗ рдХреЛрдб рдХреЛ рдФрд░ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪрд╛ рдкреЗрд╢ рдХрд┐рдпрд╛ред рдмрд╛рдж рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ, рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рдкреНрд░рддрд┐рдмрдВрдз


  • рдпрджрд┐ рд╕рднреА рдХреЛрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓реЗ рд▓рд┐рдП рдЧрдП рд╣реИрдВ, рддреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рд╕рдХреНрд╖рдо рди рдХрд░реЗрдВ, рдЕрдиреНрдпрдерд╛ рдЕрдиреНрдп рдЕрдиреБрд░реЛрдз рдзреАрдорд╛ рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред
  • рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд, рдЙрдЪреНрдЪ WORK_MEM рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдирд╛рдВрддрд░ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдмрд╣реБрдд рдореЗрдореЛрд░реА рдХреА рдЦрдкрдд рдХрд░рддрд╛ рд╣реИ - рдкреНрд░рддреНрдпреЗрдХ рд╣реИрд╢ рдЬреБрдбрд╝рддреЗ рд╣реИрдВ рдпрд╛ рд╕реЙрд░реНрдЯ рдХрд╛рдо рдХреА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдореЗрдореЛрд░реА рд▓реЗрддреЗ рд╣реИрдВред
  • рдХрдо рд╡рд┐рд▓рдВрдмрддрд╛ OLTP рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдирд┐рд╖реНрдкрд╛рджрди рджреНрд╡рд╛рд░рд╛ рддреНрд╡рд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдФрд░ рдпрджрд┐ рдХреНрд╡реЗрд░реА рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рд▓реМрдЯрддреА рд╣реИ, рддреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗрд╡рд▓ рдЗрд╕реЗ рдзреАрдорд╛ рдХрд░ рджреЗрдЧрд╛ред
  • рдбреЗрд╡рд▓рдкрд░реНрд╕ TPC-H рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВред рд╢рд╛рдпрдж рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕рдорд╛рдирд╛рдиреНрддрд░ рд╕рдорд╛рдирд╛рдВрддрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдкреНрд░рд╢реНрди рд╣реЛрдВред
  • рдХреЗрд╡рд▓ рд╡рд┐рдзреЗрдп рддрд╛рд▓реЛрдВ рдХреЗ рдмрд┐рдирд╛ рдЪрдпрдирд┐рдд рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  • рдХрднреА-рдХрднреА рд╕рд╣реА рдЕрдиреБрдХреНрд░рдордг рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдЕрдиреБрдХреНрд░рдорд┐рдХ рддрд╛рд▓рд┐рдХрд╛ рд╕реНрдХреИрди рд╕реЗ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИред
  • рдирд┐рд▓рдВрдмрд┐рдд рдкреНрд░рд╢реНрди рдФрд░ рд╢рд╛рдк рджреЗрдиреЗ рд╡рд╛рд▓реЗ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИрдВред
  • рд╡рд┐рдВрдбреЛ рдлрд╝рдВрдХреНрд╢рди рдФрд░ рдСрд░реНрдбрд░ рдХрд┐рдП рдЧрдП рд╕реЗрдЯ рдХреЗ рдХреБрд▓ рдХрд╛рд░реНрдп рд╕рдорд╛рдирд╛рдВрддрд░ рдирд╣реАрдВ рд╣реИрдВред
  • рдЖрдк I / O рдХрд╛рд░реНрдпрднрд╛рд░ рдореЗрдВ рдХреБрдЫ рднреА рд╣рд╛рд╕рд┐рд▓ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред
  • рдХреЛрдИ рд╕рдорд╛рдирд╛рдВрддрд░ рд╕реЙрд░реНрдЯрд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдирд╣реАрдВ рд╣реИрдВред рд▓реЗрдХрд┐рди рдХреНрд░рдордмрджреНрдз рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рдХреБрдЫ рдкрд╣рд▓реБрдУрдВ рдореЗрдВ рд╕рдорд╛рдирд╛рдВрддрд░ рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
  • рд╕рдорд╛рдирд╛рдВрддрд░ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреЗрд╕реНрдЯреЗрдб рдЪрдпрди рдХреЗ рд╕рд╛рде CTE (рдХреЗ рд╕рд╛рде ...) рдХреЛ рдмрджрд▓реЗрдВред
  • рддреГрддреАрдп-рдкрдХреНрд╖ рдбреЗрдЯрд╛ рд░реИрдкрд░ рд╕рдорд╛рдирд╛рдВрддрд░ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддреЗ (рд▓реЗрдХрд┐рди рд╡реЗ рдХрд░ рд╕рдХрддреЗ рдереЗ!)
  • рдкреВрд░реНрдг OOO JOIN рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИред
  • max_rows рд╕рдорд╛рдирд╛рдВрддрд░ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдЕрдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИред
  • рдпрджрд┐ рдЕрдиреБрд░реЛрдз рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬрд┐рд╕реЗ PARALLEL SAFE рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдпрд╣ рдПрдХрд▓-рдереНрд░реЗрдбреЗрдб рд╣реЛрдЧрд╛ред
  • рд▓реЗрди-рджреЗрди рдЕрд▓рдЧрд╛рд╡ рд╕реНрддрд░ SERIALIZABLE рд╕рдорд╛рдирд╛рдВрддрд░ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИред

рдкрд░реНрдпрд╛рд╡рд░рдг рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВ


PostgreSQL рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ TPC-H рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдкреНрд░рд╢реНрдиреЛрдВ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рдордп рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИред рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ PostgreSQL рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░реЗрдВ ред рдпрд╣ TPC-H рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХрд╛ рдЕрдиреМрдкрдЪрд╛рд░рд┐рдХ рдЙрдкрдпреЛрдЧ рд╣реИ - рдбреЗрдЯрд╛рдмреЗрд╕ рдпрд╛ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВред


  1. рдбрд╛рдЙрдирд▓реЛрдб TPC-H_Tools_v2.17.3.zip (рдпрд╛ рдПрдХ рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг) рдСрдл-рд╕рд╛рдЗрдЯ TPC рд╕реЗ ред
  2. Makefile.suite рдХреЛ Makefile рдХрд╛ рдирд╛рдо рдмрджрд▓реЗрдВ рдФрд░ рдпрд╣рд╛рдБ рдмрддрд╛рдП рдЕрдиреБрд╕рд╛рд░ рдмрджрд▓реЗрдВ: https://github.com/tvondra/pg_ppch рдХреЛрдб рдХреЛ рдореЗрдХ рдХрдорд╛рдВрдб рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВред
  3. рдбреЗрдЯрд╛ рдЬрдирд░реЗрдЯ рдХрд░реЗрдВ: ./dbgen -s 10 рдПрдХ 23 GB рдбреЗрдЯрд╛рдмреЗрд╕ рдмрдирд╛рддрд╛ рд╣реИред рдпрд╣ рд╕рдорд╛рдирд╛рдВрддрд░ рдФрд░ рдЧреИрд░-рд╕рдорд╛рдирд╛рдВрддрд░ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдЕрдВрддрд░ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред
  4. рдХреЗ csv for рдФрд░ sed csv for tbl рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рддред
  5. Pg_tpch рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рдХреНрд▓реЛрди рдХрд░реЗрдВ рдФрд░ csv рдХреЛ pg_tpch/dss/data рдХреЙрдкреА рдХрд░реЗрдВред
  6. qgen рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдХреНрд╡реЗрд░реА рдмрдирд╛рдПрдБред
  7. ./tpch.sh рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдбреЗрдЯрд╛ рдЕрдкрд▓реЛрдб рдХрд░реЗрдВред

рд╕рдорд╛рдирд╛рдВрддрд░ рдЕрдиреБрдХреНрд░рдорд┐рдХ рд╕реНрдХреИрди


рд╕рдорд╛рдирд╛рдВрддрд░ рдкрдврд╝рдиреЗ рдХреЗ рдХрд╛рд░рдг рдпрд╣ рддреЗрдЬ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпреЛрдВрдХрд┐ рдХрдИ рд╕реАрдкреАрдпреВ рдХреЛрд░ рдореЗрдВ рдбреЗрдЯрд╛ рдмрд┐рдЦрд░рд╛ рд╣реБрдЖ рд╣реИред рдЖрдзреБрдирд┐рдХ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдкрд░, PostgreSQL рдбреЗрдЯрд╛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХреИрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдкрдврд╝рдиреЗ-рдЖрдЧреЗ рдХреЗ рд╕рд╛рде, рдЖрдк рдкреАрдЬреА рдбреЗрдорди рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рднрдВрдбрд╛рд░рдг рд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдХреНрд╡реЗрд░реА рдкреНрд░рджрд░реНрд╢рди рдбрд┐рд╕реНрдХ 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 

рдПрдХ рдЕрдиреБрдХреНрд░рдорд┐рдХ рд╕реНрдХреИрди рдПрдХрддреНрд░реАрдХрд░рдг рдХреЗ рдмрд┐рдирд╛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХреЛ рдПрдХ рдПрдХрд▓ рд╕реАрдкреАрдпреВ рдХреЛрд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рдпрджрд┐ рдЖрдк 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() ред рдЕрдВрдд рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рд╕реЗ SUM рдХрд╛рдЙрдВрдЯрд░ рдЗрдХрдЯреНрдард╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ Gather рдиреЛрдб рджреНрд╡рд╛рд░рд╛ред


рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рдХреА рдЧрдгрдирд╛ "рдлрд╛рдЗрдирд▓ рдПрдЧреНрд░реАрдЧреЗрдЯ" рдиреЛрдб рджреНрд╡рд╛рд░рд╛ рдХреА рдЬрд╛рддреА рд╣реИред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрдкрдиреЗ рдПрдХрддреНрд░реАрдХрд░рдг рдХрд╛рд░реНрдп рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ "рд╕рдорд╛рдирд╛рдВрддрд░ рд╕реБрд░рдХреНрд╖рд┐рдд" рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВред


рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдХреА рд╕рдВрдЦреНрдпрд╛


рд╕рд░реНрд╡рд░ рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд┐рдП рдмрд┐рдирд╛ рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрдврд╝рд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИ:


 alter system set max_parallel_workers_per_gather=4; select * from pg_reload_conf(); 

рдЕрдм рд╣рдо рд╕рдордЭрд╛рддреЗ рд╣реИрдВ рдХрд┐ 4 рд╢реНрд░рдорд┐рдХ рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рд╣реИрдВ:


 tpch=# 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=1440213.58..1440213.59 rows=1 width=32) (actual time=5152.072..5152.072 rows=1 loops=1) -> Gather (cost=1440213.15..1440213.56 rows=4 width=32) (actual time=5151.807..5153.900 rows=5 loops=1) Workers Planned: 4 Workers Launched: 4 -> Partial Aggregate (cost=1439213.15..1439213.16 rows=1 width=32) (actual time=5147.238..5147.239 rows=1 loops=5) -> Parallel Seq Scan on lineitem (cost=0.00..1402428.00 rows=14714059 width=5) (actual time=0.037..3601.882 rows=11767943 loops=5) Filter: (l_shipdate <= '1998-08-18 00:00:00'::timestamp without time zone) Rows Removed by Filter: 229267 Planning Time: 0.218 ms Execution Time: 5153.967 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 

рд╣рд░ рдмрд╛рд░ рдПрдХ рдЯреЗрдмрд▓ min_parallel_(index|table)_scan_size рд╕реЗ 3 рдЧреБрдирд╛ рдмрдбрд╝рд╛ рд╣реЛрддрд╛ рд╣реИ, рдкреЛрд╕реНрдЯрдЧреНрд░реИрдлрд╝ рдПрдХ рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдХрд╛рд░реНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд▓рд╛рдЧрдд рдЖрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рд╣реИред рдкрд░рд┐рдкрддреНрд░ рдирд┐рд░реНрднрд░рддрд╛ рдЬрдЯрд┐рд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЬрдЯрд┐рд▓ рдмрдирд╛рддреА рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдЕрдиреБрд╕реВрдЪрдХ рд╕рд░рд▓ рдирд┐рдпрдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред


рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдпреЗ рдирд┐рдпрдо рд╣рдореЗрд╢рд╛ рдЙрддреНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд▓рд┐рдП рд╡рд░реНрдХрдлрд╝реНрд▓реЛрдЬрд╝ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ: ALTER TABLE ... SET ( parallel_workers = N )ред


рд╕рдорд╛рдирд╛рдВрддрд░ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ?


рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреА рдПрдХ рд▓рдВрдмреА рд╕реВрдЪреА рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд▓рд╛рдЧрдд рдХреА рдЬрд╛рдБрдЪ рднреА рд╣реЛрддреА рд╣реИ:


parallel_setup_cost - рд▓рдШреБ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдмрд┐рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдпрд╣ рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдореЛрд░реА рддреИрдпрд╛рд░ рдХрд░рдиреЗ, рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдФрд░ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдбреЗрдЯрд╛ рд╡рд┐рдирд┐рдордп рдХреЗ рд▓рд┐рдП рд╕рдордп рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рддрд╛ рд╣реИред


parallel_tuple_cost : рдПрдХ рдиреЗрддрд╛ рдФрд░ рд╢реНрд░рдорд┐рдХреЛрдВ рдХреЗ рдмреАрдЪ рд╕рдВрдЪрд╛рд░ рдХрд╛рд░реНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рд╕реЗ рдЯреНрдпреВрдкрд▓реНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдЕрдиреБрдкрд╛рдд рдореЗрдВ рджреЗрд░реА рд╣реЛ рд╕рдХрддреА рд╣реИред рдпрд╣ рдкреИрд░рд╛рдореАрдЯрд░ рдбреЗрдЯрд╛ рд╡рд┐рдирд┐рдордп рд▓рд╛рдЧрддреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИред


рдиреЗрд╕реНрдЯреЗрдб рд▓реВрдк рдЬреЙрдЗрди


 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) 

рдорд░реНрдЬ рдЬреНрд╡рд╛рдЗрди рдиреЛрдб Gather Merge рдХреЗ рдКрдкрд░ рд╕реНрдерд┐рдд рд╣реИред рддреЛ рдорд░реНрдЬ рд╕рдорд╛рдирд╛рдВрддрд░ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╕рдорд╛рдирд╛рдВрддрд░ рд╕реВрдЪрдХрд╛рдВрдХ рд╕реНрдХреИрди рдиреЛрдб рдЕрднреА рднреА part_pkey рдЦрдВрдб рдХреЗ рд╕рд╛рде рдорджрдж рдХрд░рддрд╛ рд╣реИред


рдЕрдиреБрднрд╛рдЧ рдХрдиреЗрдХреНрд╢рди


PostgreSQL 11 рдореЗрдВ, рд╡рд┐рднрд╛рдЬрди рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЕрдХреНрд╖рдо рд╣реИ: рдЗрд╕рдореЗрдВ рдмрд╣реБрдд рдорд╣рдВрдЧрд╛ рд╢реЗрдбреНрдпреВрд▓рд┐рдВрдЧ рд╣реИред рд╕рдорд╛рди рд╡рд┐рднрд╛рдЬрди рд╡рд╛рд▓реЗ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рдЕрдиреБрднрд╛рдЧ рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рддреЛ Postgres рдЫреЛрдЯреЗ рд╣реИрд╢ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрднрд╛рдЧ рдХрдиреЗрдХреНрд╢рди рд╕рдорд╛рдирд╛рдВрддрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред


 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 ALL рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рд╕рд╛рде рд╣реЛрддрд╛ рд╣реИред рдиреБрдХрд╕рд╛рди рдХрдо рд╕рдорд╛рдирддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдХреЗрд╡рд▓ 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 рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдХреА рдорд╛рддреНрд░рд╛ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рддрд╛ рд╣реИ, рди рдХрд┐ рдХреЗрд╡рд▓ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП: рдХрд╛рд░реНрдп_рдо рдХрдиреЗрдХреНрд╢рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ = рдмрд╣реБрдд рд╕рд╛рд░реА рдореЗрдореЛрд░реАред
  • max_parallel_workers_per_gather - рдпреЛрдЬрдирд╛ рд╕реЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд┐рддрдиреЗ рдХрд╛рдо рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред
  • max_worker_processes - рд╕рд░реНрд╡рд░ рдкрд░ CPU рдХреЛрд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХрд╛рд░реНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рдХреБрд▓ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рддрд╛ рд╣реИред
  • max_parallel_workers рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдорд╛рдирд╛рдВрддрд░ рд╡рд░реНрдХрдлрд╝реНрд▓реЛрдЬрд╝ рдХреЗ рд▓рд┐рдПред

рдкрд░рд┐рдгрд╛рдо


рд╕рдВрд╕реНрдХрд░рдг 9.6 рд╕реЗ рд╢реБрд░реВ рд╣реЛрдХрд░, рд╕рдорд╛рдирд╛рдВрддрд░ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрдИ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдпрд╛ рдЗрдВрдбреЗрдХреНрд╕ рдХреЛ рд╕реНрдХреИрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЬрдЯрд┐рд▓ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдЧрдВрднреАрд░рддрд╛ рд╕реЗ рд╕реБрдзрд╛рд░ рд╕рдХрддрд╛ рд╣реИред PostgreSQL 10 рдореЗрдВ, рд╕рдорд╛рдирд╛рдВрддрд░ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕рдХреНрд╖рдо рд╣реИред рдмрдбрд╝реЗ рдУрдПрд▓рдЯреАрдкреА рд╡рд░реНрдХрд▓реЛрдб рд╡рд╛рд▓реЗ рд╕рд░реНрд╡рд░ рдкрд░ рдЗрд╕реЗ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд░рдирд╛ рдпрд╛рдж рд░рдЦреЗрдВред рдЕрдиреБрдХреНрд░рдорд┐рдХ рд╕реНрдХреИрди рдпрд╛ рдЗрдВрдбреЗрдХреНрд╕ рд╕реНрдХреИрди рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рд╕рдВрдкреВрд░реНрдг рдбреЗрдЯрд╛рд╕реЗрдЯ рдореЗрдВ рд░рд┐рдкреЛрд░реНрдЯ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдХреНрд╡реЗрд░реАрдЬрд╝ рдХреЛ рдХреЗрд╡рд▓ рд▓рд╛рдкрддрд╛ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдЬреЛрдбрд╝рдХрд░ рдпрд╛ рд╕рд╣реА рд╡рд┐рднрд╛рдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рд╕рдВрджрд░реНрдн


Source: https://habr.com/ru/post/hi446706/


All Articles