
āĻāϧā§āύāĻŋāĻ CPU-āϤ⧠āĻĒā§āϰāĻā§āϰ āĻā§āϰ āĻĨāĻžāĻā§āĨ¤ āĻŦāĻāϰā§āϰ āĻĒāϰ āĻŦāĻāϰ āϧāϰā§, āĻ
ā§āϝāĻžāĻĒā§āϞāĻŋāĻā§āĻļāύāĻā§āϞāĻŋ āϏāĻŽāĻžāύā§āϤāϰāĻžāϞāĻāĻžāĻŦā§ āĻĄā§āĻāĻžāĻŦā§āϏ⧠āĻĒā§āϰāĻļā§āύ āĻĒāĻžāĻ āĻžāĻā§āĻā§āĨ¤ āϝāĻĻāĻŋ āĻāĻāĻŋ āĻāĻāĻāĻŋ āĻā§āĻŦāĻŋāϞā§āϰ āĻāĻāĻžāϧāĻŋāĻ āϏāĻžāϰāĻŋāϤ⧠āĻāĻāĻāĻŋ āĻĒā§āϰāϤāĻŋāĻŦā§āĻĻāύā§āϰ āĻĒā§āϰāĻļā§āύ āĻšāϝāĻŧ, āϤāĻŦā§ āĻāĻāĻžāϧāĻŋāĻ CPU āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ āĻāĻāĻŋ āĻĻā§āϰā§āϤ āĻāϞ⧠āĻāĻŦāĻ PostgreSQL āϏāĻāϏā§āĻāϰāĻŖ 9.6 āĻĨā§āĻā§ āĻāĻāĻŋ āĻāϰāϤ⧠āϏāĻā§āώāĻŽ āĻšāϝāĻŧā§āĻā§āĨ¤
āϏāĻŽāĻžāύā§āϤāϰāĻžāϞ āĻā§āϝā§āϝāĻŧāĻžāϰ⧠āĻŦā§āĻļāĻŋāώā§āĻā§āϝāĻāĻŋ āĻŦāĻžāϏā§āϤāĻŦāĻžāϝāĻŧāύ āĻāϰāϤ⧠3 āĻŦāĻāϰ āϞā§āĻā§āĻā§ - āĻāĻŽāĻžāĻĻā§āϰ āĻā§āϝā§āϝāĻŧāĻžāϰ⧠āϏāĻŽā§āĻĒāĻžāĻĻāύā§āϰ āĻŦāĻŋāĻāĻŋāύā§āύ āĻĒāϰā§āϝāĻžāϝāĻŧā§ āĻā§āĻĄāĻāĻŋ āĻĒā§āύāϰāĻžāϝāĻŧ āϞāĻŋāĻāϤ⧠āĻšāϝāĻŧā§āĻāĻŋāϞāĨ¤ PostgreSQL 9.6 āĻā§āĻĄāĻā§ āĻāϰāĻ āĻāύā§āύāϤ āĻāϰāĻžāϰ āĻāύā§āϝ āĻ āĻŦāĻāĻžāĻ āĻžāĻŽā§ āĻāĻžāϞ⧠āĻāϰā§āĻā§āĨ¤ āĻĒāϰāĻŦāϰā§āϤ⧠āϏāĻāϏā§āĻāϰāĻŖāĻā§āϞāĻŋāϤā§, āĻ āύā§āϝāĻžāύā§āϝ āϧāϰāĻŖā§āϰ āĻĒā§āϰāĻļā§āύāĻā§āϞāĻŋ āϏāĻŽāĻžāύā§āϤāϰāĻžāϞāĻāĻžāĻŦā§ āĻāĻžāϰā§āϝāĻāϰ āĻāϰāĻž āĻšāϝāĻŧāĨ¤
āϏā§āĻŽāĻžāĻŦāĻĻā§āϧāϤāĻž
- āϏāĻŽāϏā§āϤ āĻā§āϰ āĻāϤāĻŋāĻŽāϧā§āϝā§āĻ āĻŦā§āϝāϏā§āϤ āĻĨāĻžāĻāϞ⧠āϏāĻŽāĻžāύā§āϤāϰāĻžāϞ āϏāĻŽā§āĻĒāĻžāĻĻāύ āϏāĻā§āώāĻŽ āĻāϰāĻŦā§āύ āύāĻž, āĻ āύā§āϝāĻĨāĻžāϝāĻŧ āĻ āύā§āϝāĻžāύā§āϝ āĻ āύā§āϰā§āϧāĻā§āϞāĻŋ āϧā§āϰ āĻšāϝāĻŧā§ āϝāĻžāĻŦā§āĨ¤
- āϏāĻŦāĻā§āϝāĻŧā§ āĻā§āϰā§āϤā§āĻŦāĻĒā§āϰā§āĻŖ, āĻāĻā§āĻ WORK_MEM āĻŽāĻžāύ āϏāĻš āϏāĻŽāĻžāύā§āϤāϰāĻžāϞ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻžāĻāϰāĻŖ āĻ āύā§āĻ āĻŽā§āĻŽāϰāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠- āĻĒā§āϰāϤāĻŋāĻāĻŋ āĻšā§āϝāĻžāĻļ āϝā§āĻāĻĻāĻžāύ āĻŦāĻž āϏāĻžāĻāĻžāύā§āϰ āĻāĻžāĻ_āĻŽā§āĻŽ āĻŽā§āĻŽāϰāĻŋ āĻā§āϰāĻšāĻŖ āĻāϰā§āĨ¤
- āĻāĻŽ āϞā§āĻā§āύā§āϏāĻŋ OLTP āĻĒā§āϰāĻļā§āύ āϏāĻŽāĻžāύā§āϤāϰāĻžāϞ āϏāĻŽā§āĻĒāĻžāĻĻāύ āĻĻā§āĻŦāĻžāϰāĻž āϤā§āĻŦāϰāĻžāύā§āĻŦāĻŋāϤ āĻāϰāĻž āϝāĻžāĻŦā§ āύāĻžāĨ¤ āĻāĻŦāĻ āϝāĻĻāĻŋ āĻā§āϝā§āϝāĻŧāĻžāϰ⧠āĻāĻāĻāĻŋ āϏāĻžāϰāĻŋ āĻĒā§āϰāĻĻāĻžāύ āĻāϰā§, āϏāĻŽāĻžāύā§āϤāϰāĻžāϞ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻžāĻāϰāĻŖ āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻāĻāĻŋāĻā§ āϧā§āϰ āĻāϰ⧠āĻĻā§āĻŦā§āĨ¤
- āĻŦāĻŋāĻāĻžāĻļāĻāĻžāϰā§āϰāĻž TPC-H āĻŦā§āĻā§āĻāĻŽāĻžāϰā§āĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻāύā§āĻĻ āĻāϰā§āĨ¤ āĻšāϝāĻŧāϤ⧠āĻāĻĒāύāĻžāϰ āύāĻŋāĻā§āĻāϤ āϏāĻŽāĻžāύā§āϤāϰāĻžāϞ āĻŽā§āϤā§āϝā§āĻĻāύā§āĻĄā§āϰ āĻāύā§āϝ āĻ āύā§āϰā§āĻĒ āĻĒā§āϰāĻļā§āύ āĻāĻā§āĨ¤
- āĻĒā§āϰā§āĻŦāύāĻŋāϰā§āϧāĻžāϰāĻŋāϤ āϞāĻāĻŋāĻ āĻāĻžāĻĄāĻŧāĻž āĻļā§āϧā§āĻŽāĻžāϤā§āϰ SELECT āĻĒā§āϰāĻļā§āύāĻā§āϞāĻŋ āϏāĻŽāĻžāύā§āϤāϰāĻžāϞāĻāĻžāĻŦā§ āĻāĻžāϰā§āϝāĻāϰ āĻāϰāĻž āĻšāϝāĻŧāĨ¤
- āĻāĻāύāĻ āĻāĻāύāĻ āϏāĻ āĻŋāĻ āϏā§āĻā§āĻāϰāĻŖ āϏāĻŽāĻžāύā§āϤāϰāĻžāϞ āĻŽā§āĻĄā§ āĻā§āϰāĻŽāĻŋāĻ āĻā§āĻŦāĻŋāϞ āϏā§āĻā§āϝāĻžāύāĻŋāĻāϝāĻŧā§āϰ āĻā§āϝāĻŧā§ āĻāĻžāϞāĨ¤
- āĻĒāĻ āĻāϰāĻž āĻĒā§āϰāĻļā§āύ āĻāĻŦāĻ āĻāĻžāϰā§āϏāĻžāϰ āϏāĻŽāϰā§āĻĨāĻŋāϤ āύāϝāĻŧāĨ¤
- āĻāĻāύā§āĻĄā§ āĻĢāĻžāĻāĻļāύ āĻāĻŦāĻ āĻ āϰā§āĻĄāĻžāϰāĻā§āϤ āϏā§āĻ āϏāĻžāĻŽāĻā§āϰāĻŋāĻ āĻĢāĻžāĻāĻļāύ āϏāĻŽāĻžāύā§āϤāϰāĻžāϞ āύāϝāĻŧāĨ¤
- I/O āĻāĻžāĻā§āϰ āĻāĻžāĻĒā§ āĻāĻĒāύāĻŋ āĻāĻŋāĻā§āĻ āϞāĻžāĻ āĻāϰāĻŦā§āύ āύāĻžāĨ¤
- āĻā§āύ āϏāĻŽāĻžāύā§āϤāϰāĻžāϞ āĻŦāĻžāĻāĻžāĻ āĻ ā§āϝāĻžāϞāĻāϰāĻŋāĻĻāĻŽ āĻāĻā§. āĻāĻŋāύā§āϤ⧠āĻāĻŋāĻā§ āĻŦāĻŋāώāϝāĻŧā§ āϏāĻŽāĻžāύā§āϤāϰāĻžāϞāĻāĻžāĻŦā§ āĻŦāĻŋāĻāĻŋāύā§āύ āϧāϰāĻŖā§āϰ āĻĒā§āϰāĻļā§āύ āĻāϰāĻž āϝā§āϤ⧠āĻĒāĻžāϰā§āĨ¤
- āϏāĻŽāĻžāύā§āϤāϰāĻžāϞ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻžāĻāϰāĻŖ āϏāĻā§āώāĻŽ āĻāϰāϤ⧠āĻāĻāĻāĻŋ āύā§āϏā§āĻā§āĻĄ SELECT āĻĻāĻŋāϝāĻŧā§ CTE (āϏāĻš ...) āĻĒā§āϰāϤāĻŋāϏā§āĻĨāĻžāĻĒāύ āĻāϰā§āύāĨ¤
- āϤā§āϤā§āϝāĻŧ āĻĒāĻā§āώā§āϰ āĻĄā§āĻāĻž āĻŽā§āĻĄāĻŧāĻāĻā§āϞāĻŋ āĻāĻāύāĻ āϏāĻŽāĻžāύā§āϤāϰāĻžāϞ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻžāĻāϰāĻŖ āϏāĻŽāϰā§āĻĨāύ āĻāϰ⧠āύāĻž (āϤāĻŦā§ āϤāĻžāϰāĻž āĻĒāĻžāϰā§!)
- āϏāĻŽā§āĻĒā§āϰā§āĻŖ āĻŦāĻžāĻāϰā§āϰ āϝā§āĻāĻĻāĻžāύ āϏāĻŽāϰā§āĻĨāĻŋāϤ āύāϝāĻŧāĨ¤
- max_rows āϏāĻŽāĻžāύā§āϤāϰāĻžāϞ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻžāĻāϰāĻŖ āύāĻŋāώā§āĻā§āϰāĻŋāϝāĻŧ āĻāϰā§āĨ¤
- āϝāĻĻāĻŋ āĻāĻāĻāĻŋ āĻĒā§āϰāĻļā§āύ⧠āĻāĻŽāύ āĻāĻāĻāĻŋ āĻĢāĻžāĻāĻļāύ āĻĨāĻžāĻā§ āϝāĻž āϏāĻŽāĻžāύā§āϤāϰāĻžāϞ āύāĻŋāϰāĻžāĻĒāĻĻ āĻšāĻŋāϏāĻžāĻŦā§ āĻāĻŋāĻšā§āύāĻŋāϤ āĻāϰāĻž āĻšāϝāĻŧ āύāĻž, āϤāĻŦā§ āĻāĻāĻŋ āĻāĻāĻ āĻĨā§āϰā§āĻĄā§āĻĄ āĻšāĻŦā§ā§ˇ
- āϏāĻŋāϰāĻŋāϝāĻŧāĻžāϞāĻžāĻāĻā§āĻŦāϞ āϞā§āύāĻĻā§āύ āĻŦāĻŋāĻā§āĻāĻŋāύā§āύāϤāĻž āϏā§āϤāϰ āϏāĻŽāĻžāύā§āϤāϰāĻžāϞ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻžāĻāϰāĻŖ āĻ āĻā§āώāĻŽ āĻāϰā§āĨ¤
āĻĒāϰā§āĻā§āώāĻžāϰ āĻĒāϰāĻŋāĻŦā§āĻļ
PostgreSQL āĻŦāĻŋāĻāĻžāĻļāĻāĻžāϰā§āϰāĻž TPC-H āĻŦā§āĻā§āĻāĻŽāĻžāϰā§āĻ āĻĒā§āϰāĻļā§āύā§āϰ āĻĒā§āϰāϤāĻŋāĻā§āϰāĻŋāϝāĻŧāĻž āϏāĻŽāϝāĻŧ āĻāĻŽāĻžāύā§āϰ āĻā§āώā§āĻāĻž āĻāϰā§āĻā§āĨ¤ āĻŦā§āĻā§āĻāĻŽāĻžāϰā§āĻ āĻĄāĻžāĻāύāϞā§āĻĄ āĻāϰā§āύ āĻāĻŦāĻ . āĻāĻāĻŋ TPC-H āĻŦā§āĻā§āĻāĻŽāĻžāϰā§āĻā§āϰ āĻāĻāĻāĻŋ āĻ āύāĻžāύā§āώā§āĻ āĻžāύāĻŋāĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ - āĻĄāĻžāĻāĻžāĻŦā§āϏ āĻŦāĻž āĻšāĻžāϰā§āĻĄāĻāϝāĻŧā§āϝāĻžāϰ āϤā§āϞāύāĻžāϰ āĻāύā§āϝ āύāϝāĻŧāĨ¤
- āĻĄāĻžāĻāύāϞā§āĻĄ āĻāϰā§āύ TPC-H_Tools_v2.17.3.zip (āĻŦāĻž āύāϤā§āύ āϏāĻāϏā§āĻāϰāĻŖ) .
- makefile.suite āĻāϰ āύāĻžāĻŽ āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻāϰ⧠Makefile āĻāϰā§āύ āĻāĻŦāĻ āĻāĻāĻžāύ⧠āĻŦāϰā§āĻŖāĻŋāϤ āĻšāĻŋāϏāĻžāĻŦā§ āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻāϰā§āύ: . āĻŽā§āĻ āĻāĻŽāĻžāύā§āĻĄ āĻĻāĻŋāϝāĻŧā§ āĻā§āĻĄ āĻāĻŽā§āĻĒāĻžāĻāϞ āĻāϰā§āύāĨ¤
- āĻĄā§āĻāĻž āϤā§āϰāĻŋ āĻāϰā§āύ:
./dbgen -s 10āĻāĻāĻāĻŋ 23 āĻāĻŋāĻŦāĻŋ āĻĄāĻžāĻāĻžāĻŦā§āϏ āϤā§āϰāĻŋ āĻāϰā§āĨ¤ āϏāĻŽāĻžāύā§āϤāϰāĻžāϞ āĻāĻŦāĻ āĻ -āϏāĻŽāĻžāύā§āϤāϰāĻžāϞ āĻĒā§āϰāĻļā§āύā§āϰ āĻāϰā§āĻŽāĻā§āώāĻŽāϤāĻž āĻĒāĻžāϰā§āĻĨāĻā§āϝ āĻĻā§āĻāϤ⧠āĻāĻāĻŋ āϝāĻĨā§āώā§āĻāĨ¤ - āĻĢāĻžāĻāϞ āĻāύāĻāĻžāϰā§āĻ āĻāϰā§āύ
tblвcsv Ņ forиsed. - āϏāĻāĻā§āϰāĻšāϏā§āĻĨāϞ āĻā§āϞā§āύ āĻāϰā§āύ
pg_tpchāĻāĻŦāĻ āĻĢāĻžāĻāϞ āĻāĻĒāĻŋ āĻāϰā§āύcsvвpg_tpch/dss/data. - āĻāĻāĻāĻŋ āĻāĻŽāĻžāύā§āĻĄ āĻĻāĻŋāϝāĻŧā§ āĻĒā§āϰāĻļā§āύ āϤā§āϰāĻŋ āĻāϰā§āύ
qgen. - āĻāĻŽāĻžāύā§āĻĄ āĻĻāĻŋāϝāĻŧā§ āĻĄāĻžāĻāĻžāĻŦā§āϏ⧠āĻĄā§āĻāĻž āϞā§āĻĄ āĻāϰā§āύ
./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āĻāĻŋ āϏāĻžāϰāĻŋ āϰāϝāĻŧā§āĻā§: āϤā§āϰā§āĻāĻŋāϰ āĻāύā§āϝ āĻāĻŦāĻ āĻāĻŋāĻĒāϞā§āϰ āĻāύā§āϝāĨ¤
āĻāϤ āĻāϰā§āĻŽāĻĒā§āϰāĻŦāĻžāĻš āĻĒā§āϰāϝāĻŧā§āĻāύ?
āϏāϰā§āĻŦāύāĻŋāĻŽā§āύ āϏā§āĻŽāĻž āĻĒāϰāĻžāĻŽāĻŋāϤāĻŋ āĻĻā§āĻŦāĻžāϰāĻž āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āĻāϰāĻž āĻšāϝāĻŧ . āĻ āύā§āϰā§āϧ āϰāĻžāύāĻžāϰ āϤāĻžāϰāĻĒāϰ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāĻāĻžāϰ āĻĻā§āĻŦāĻžāϰāĻž āϏā§āĻŽāĻŋāϤ āĻĒā§āϞ āĻĨā§āĻā§ āĻāϰā§āĻŽā§ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻž āύā§āϝāĻŧ . āĻļā§āώ āϏā§āĻŽāĻžāĻŦāĻĻā§āϧāϤāĻž āĻšāϞ , āĻ āϰā§āĻĨāĻžā§, āĻĒāĻāĻā§āĻŽāĻŋ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻžāϰ āĻŽā§āĻ āϏāĻāĻā§āϝāĻžāĨ¤
āϝāĻĻāĻŋ āĻāϰā§āĻŽā§ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻž āĻŦāϰāĻžāĻĻā§āĻĻ āĻāϰāĻž āϏāĻŽā§āĻāĻŦ āύāĻž āĻšāϝāĻŧ āϤāĻŦā§ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻžāĻāϰāĻŖ āĻšāĻŦā§ āĻāĻāĻ-āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻžāĨ¤
āĻā§āϝā§āϝāĻŧāĻžāϰ⧠āĻĒā§āϞā§āϝāĻžāύāĻžāϰ āĻā§āĻŦāĻŋāϞ āĻŦāĻž āϏā§āĻāĻā§āϰ āĻāĻāĻžāϰā§āϰ āĻāĻĒāϰ āύāĻŋāϰā§āĻāϰ āĻāϰ⧠āĻāϰā§āĻŽāĻĒā§āϰāĻŦāĻžāĻš āĻāĻŽāĻžāϤ⧠āĻĒāĻžāϰā§āĨ¤ āĻāĻ āĻāύā§āϝ āĻĒāϰāĻžāĻŽāĻŋāϤāĻŋ āĻāĻā§ Đ¸ .
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).
āĻā§āύ āϏāĻŽāĻžāύā§āϤāϰāĻžāϞ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻžāĻāϰāĻŖ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āĻšāϝāĻŧ āύāĻž?
āĻŦāĻŋāϧāĻŋāύāĻŋāώā§āϧā§āϰ āĻĻā§āϰā§āĻ āϤāĻžāϞāĻŋāĻāĻž āĻāĻžāĻĄāĻŧāĻžāĻ, āĻāϰāĻ āĻā§āĻāĻ āϰāϝāĻŧā§āĻā§:
- āϏāĻāĻā§āώāĻŋāĻĒā§āϤ āĻ āύā§āϰā§āϧā§āϰ āϏāĻŽāĻžāύā§āϤāϰāĻžāϞ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻžāĻāϰāĻŖ āĻāĻĄāĻŧāĻžāϤā§āĨ¤ āĻāĻ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāĻāĻžāϰāĻāĻŋ āĻŽā§āĻŽāϰāĻŋ āĻĒā§āϰāϏā§āϤā§āϤ āĻāϰāĻžāϰ, āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻž āĻļā§āϰ⧠āĻāϰāĻžāϰ āĻāĻŦāĻ āĻĒā§āϰāĻžāĻĨāĻŽāĻŋāĻ āĻĄā§āĻāĻž āĻŦāĻŋāύāĻŋāĻŽāϝāĻŧā§āϰ āϏāĻŽāϝāĻŧ āĻ āύā§āĻŽāĻžāύ āĻāϰā§āĨ¤
: āύā§āϤāĻž āĻāĻŦāĻ āĻāϰā§āĻŽā§āĻĻā§āϰ āĻŽāϧā§āϝ⧠āϝā§āĻāĻžāϝā§āĻ āĻāĻžāĻ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻž āĻĨā§āĻā§ 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 msTPC-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 āĻĒā§āϰāϏā§āϏ āϏāĻāϝā§āĻ = āĻ āύā§āĻ āĻŽā§āĻŽāϰāĻŋāĨ¤
- â āĻĒāϰāĻŋāĻāϞā§āĻĒāύāĻž āĻĨā§āĻā§ āϏāĻŽāĻžāύā§āϤāϰāĻžāϞ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻžāĻāϰāĻŖā§āϰ āĻāύā§āϝ āύāĻŋāϰā§āĻŦāĻžāĻšāĻāĻžāϰ⧠āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻāϤāĻāύ āĻāϰā§āĻŽā§ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻŦā§āĨ¤
- â āϏāĻžāϰā§āĻāĻžāϰ⧠CPU āĻā§āϰā§āϰ āϏāĻāĻā§āϝāĻžāϰ āϏāĻžāĻĨā§ āĻāϰā§āĻŽā§ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻžāϰ āĻŽā§āĻ āϏāĻāĻā§āϝāĻž āϏāĻžāĻŽāĻā§āĻāϏā§āϝ āĻāϰā§āĨ¤
- - āĻāĻāĻ, āĻāĻŋāύā§āϤ⧠āϏāĻŽāĻžāύā§āϤāϰāĻžāϞ āĻāĻžāĻā§āϰ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻžāϰ āĻāύā§āϝāĨ¤
āĻĢāϞāĻžāĻĢāϞ
āϏāĻāϏā§āĻāϰāĻŖ 9.6 āĻ āύā§āϏāĻžāϰā§, āϏāĻŽāĻžāύā§āϤāϰāĻžāϞ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻžāĻāϰāĻŖ āĻāĻāĻŋāϞ āĻĒā§āϰāĻļā§āύā§āϰ āĻāϰā§āĻŽāĻā§āώāĻŽāϤāĻžāĻā§ āĻŦā§āϝāĻžāĻĒāĻāĻāĻžāĻŦā§ āĻāύā§āύāϤ āĻāϰāϤ⧠āĻĒāĻžāϰ⧠āϝāĻž āĻ āύā§āĻ āϏāĻžāϰāĻŋ āĻŦāĻž āϏā§āĻā§ āϏā§āĻā§āϝāĻžāύ āĻāϰā§āĨ¤ PostgreSQL 10-āĻ, āϏāĻŽāĻžāύā§āϤāϰāĻžāϞ āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻžāĻāϰāĻŖ āĻĄāĻŋāĻĢāϞā§āĻāϰā§āĻĒā§ āϏāĻā§āϰāĻŋāϝāĻŧ āĻāϰāĻž āĻšāϝāĻŧāĨ¤ āĻāĻāĻāĻŋ āĻŦāĻĄāĻŧ OLTP āĻāϝāĻŧāĻžāϰā§āĻāϞā§āĻĄ āϏāĻš āϏāĻžāϰā§āĻāĻžāϰ⧠āĻāĻāĻŋ āύāĻŋāώā§āĻā§āϰāĻŋāϝāĻŧ āĻāϰāϤ⧠āĻŽāύ⧠āϰāĻžāĻāĻŦā§āύāĨ¤ āĻ āύā§āĻā§āϰāĻŽāĻŋāĻ āϏā§āĻā§āϝāĻžāύ āĻŦāĻž āϏā§āĻāĻ āϏā§āĻā§āϝāĻžāύāĻā§āϞāĻŋ āĻĒā§āϰāĻā§āϰ āϏāĻāϏā§āĻĨāĻžāύ āĻā§āϰāĻšāĻŖ āĻāϰā§āĨ¤ āĻāĻĒāύāĻŋ āϝāĻĻāĻŋ āϏāĻŽā§āĻĒā§āϰā§āĻŖ āĻĄā§āĻāĻžāϏā§āĻā§āϰ āĻāĻĒāϰ āĻāĻāĻāĻŋ āĻĒā§āϰāϤāĻŋāĻŦā§āĻĻāύ āύāĻž āĻāĻžāϞāĻžāύ, āϤāĻžāĻšāϞ⧠āĻāĻĒāύāĻŋ āĻā§āĻŦāϞ āĻ āύā§āĻĒāϏā§āĻĨāĻŋāϤ āϏā§āĻā§ āϝā§āĻ āĻāϰ⧠āĻŦāĻž āϏāĻ āĻŋāĻ āĻĒāĻžāϰā§āĻāĻŋāĻļāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻā§āϝā§āϝāĻŧāĻžāϰ⧠āĻāϰā§āĻŽāĻā§āώāĻŽāϤāĻž āĻāύā§āύāϤ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύāĨ¤
āϰā§āĻĢāĻžāϰā§āύā§āϏ
āĻāϤā§āϏ: www.habr.com
