PostgreSQL-เดฒเต† เดธเดฎเดพเดจเตเดคเดฐ เด…เดจเตเดตเต‡เดทเดฃเด™เตเด™เตพ

PostgreSQL-เดฒเต† เดธเดฎเดพเดจเตเดคเดฐ เด…เดจเตเดตเต‡เดทเดฃเด™เตเด™เตพ
เด†เดงเตเดจเดฟเด• เดธเดฟเดชเดฟเดฏเตเดตเดฟเดจเต เดงเดพเดฐเดพเดณเด‚ เด•เต‹เดฑเตเด•เตพ เด‰เดฃเตเดŸเต. เดตเตผเดทเด™เตเด™เดณเดพเดฏเดฟ, เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เตพ เดธเดฎเดพเดจเตเดคเดฐเดฎเดพเดฏเดฟ เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเตเด•เดณเดฟเดฒเต‡เด•เตเด•เต เดšเต‹เดฆเตเดฏเด™เตเด™เตพ เด…เดฏเดฏเตเด•เตเด•เตเดจเตเดจเต. เด‡เดคเต เด’เดฐเต เดชเดŸเตเดŸเดฟเด•เดฏเดฟเดฒเต† เด’เดจเตเดจเดฟเดฒเดงเดฟเด•เด‚ เดตเดฐเดฟเด•เดณเดฟเดฒเต† เดฑเดฟเดชเตเดชเต‹เตผเดŸเตเดŸเต เด…เดจเตเดตเต‡เดทเดฃเดฎเดพเดฃเต†เด™เตเด•เดฟเตฝ, เด’เดจเตเดจเดฟเดฒเดงเดฟเด•เด‚ เดธเดฟเดชเดฟเดฏเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ เด…เดคเต เดตเต‡เด—เดคเตเดคเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเต, เด•เต‚เดŸเดพเดคเต† เดชเดคเดฟเดชเตเดชเต 9.6 เดฎเตเดคเตฝ PostgreSQL-เดจเต เด‡เดคเต เดšเต†เดฏเตเดฏเดพเตป เด•เดดเดฟเดฏเตเด‚.

เดธเดฎเดพเดจเตเดคเดฐ เด…เดจเตเดตเต‡เดทเดฃ เดซเต€เดšเตเดšเตผ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เดพเตป 3 เดตเตผเดทเดฎเต†เดŸเตเดคเตเดคเต - เด•เตเดตเดฑเดฟ เดŽเด•เตเดธเดฟเด•เตเดฏเต‚เดทเดจเตเดฑเต† เดตเดฟเดตเดฟเดง เด˜เดŸเตเดŸเด™เตเด™เดณเดฟเตฝ เดžเด™เตเด™เตพเด•เตเด•เต เด•เต‹เดกเต เดตเต€เดฃเตเดŸเตเด‚ เดŽเดดเตเดคเต‡เดฃเตเดŸเดฟ เดตเดจเตเดจเต. เด•เต‹เดกเต เด•เต‚เดŸเตเดคเตฝ เดฎเต†เดšเตเดšเดชเตเดชเต†เดŸเตเดคเตเดคเตเดจเตเดจเดคเดฟเดจเดพเดฏเดฟ PostgreSQL 9.6 เด‡เตปเดซเตเดฐเดพเดธเตเดŸเตเดฐเด•เตเดšเตผ เด…เดตเดคเดฐเดฟเดชเตเดชเดฟเดšเตเดšเต. เดคเตเดŸเตผเดจเตเดจเตเดณเตเดณ เดชเดคเดฟเดชเตเดชเตเด•เดณเดฟเตฝ, เดฎเดฑเตเดฑเต เดคเดฐเดคเตเดคเดฟเดฒเตเดณเตเดณ เด…เดจเตเดตเต‡เดทเดฃเด™เตเด™เตพ เดธเดฎเดพเดจเตเดคเดฐเดฎเดพเดฏเดฟ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเต.

เดจเดฟเดฏเดจเตเดคเตเดฐเดฃเด™เตเด™เตพ

  • เดŽเดฒเตเดฒเดพ เด•เต‹เดฑเตเด•เดณเตเด‚ เด‡เดคเดฟเดจเด•เด‚ เดคเดฟเดฐเด•เตเด•เดฟเดฒเดพเดฃเต†เด™เตเด•เดฟเตฝ เดธเดฎเดพเดจเตเดคเดฐ เดจเดฟเตผเดตเตเดตเดนเดฃเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดจเด•เตเดทเดฎเดฎเดพเด•เตเด•เดฐเตเดคเต, เด…เดฒเตเดฒเดพเดคเตเดคเดชเด•เตเดทเด‚ เดฎเดฑเตเดฑเต เด…เดญเตเดฏเตผเดคเตเดฅเดจเด•เตพ เดฎเดจเตเดฆเด—เดคเดฟเดฏเดฟเดฒเดพเด•เตเด‚.
  • เดเดฑเตเดฑเดตเตเด‚ เดชเตเดฐเดงเดพเดจเดฎเดพเดฏเดฟ, เด‰เดฏเตผเดจเตเดจ WORK_MEM เดฎเต‚เดฒเตเดฏเด™เตเด™เดณเตเดณเตเดณ เดธเดฎเดพเดจเตเดคเดฐ เดชเตเดฐเต‹เดธเดธเตเดธเดฟเด‚เด—เต เดงเดพเดฐเดพเดณเด‚ เดฎเต†เดฎเตเดฎเดฑเดฟ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต - เด“เดฐเต‹ เดนเดพเดทเต เดœเต‹เดฏเดฟเดจเตเด‚ เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดธเต‹เตผเดŸเตเดŸเตเด‚ work_mem เดฎเต†เดฎเตเดฎเดฑเดฟ เดŽเดŸเตเด•เตเด•เตเดจเตเดจเต.
  • เดธเดฎเดพเดจเตเดคเดฐ เดจเดฟเตผเดตเตเดตเดนเดฃเด‚ เดตเดดเดฟ เด•เตเดฑเดžเตเดž เดฒเต‡เดฑเตเดฑเตปเดธเดฟ OLTP เด…เดจเตเดตเต‡เดทเดฃเด™เตเด™เตพ เดคเตเดตเดฐเดฟเดคเดชเตเดชเต†เดŸเตเดคเตเดคเดพเตป เด•เดดเดฟเดฏเดฟเดฒเตเดฒ. เดšเต‹เดฆเตเดฏเด‚ เด’เดฐเต เดตเดฐเดฟ เดจเตฝเด•เตเด•เดฏเดพเดฃเต†เด™เตเด•เดฟเตฝ, เดธเดฎเดพเดจเตเดคเดฐ เดชเตเดฐเต‹เดธเดธเตเดธเดฟเด‚เด—เต เด…เดคเดฟเดจเต† เดฎเดจเตเดฆเด—เดคเดฟเดฏเดฟเดฒเดพเด•เตเด•เตเด‚.
  • TPC-H เดฌเต†เดžเตเดšเตเดฎเดพเตผเด•เตเด•เต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเตป เดกเดตเดฒเดชเตเดชเตผเดฎเดพเตผ เด‡เดทเตเดŸเดชเตเดชเต†เดŸเตเดจเตเดจเต. เดธเดฎเดพเดจเตเดคเดฐเดฎเดพเดฏ เดจเดฟเตผเดตเตเดตเดนเดฃเดคเตเดคเดฟเดจเดพเดฏเดฟ เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดธเดฎเดพเดจเดฎเดพเดฏ เดšเต‹เดฆเตเดฏเด™เตเด™เตพ เด‰เดฃเตเดŸเดพเดฏเดฟเดฐเดฟเด•เตเด•เดพเด‚.
  • เดชเตเดฐเต†เดกเดฟเด•เตเด•เต‡เดฑเตเดฑเต เดฒเต‹เด•เตเด•เดฟเด‚เด—เต เด‡เดฒเตเดฒเดพเดคเตเดค SELECT เด…เดจเตเดตเต‡เดทเดฃเด™เตเด™เตพ เดฎเดพเดคเตเดฐเดฎเต‡ เดธเดฎเดพเดจเตเดคเดฐเดฎเดพเดฏเดฟ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเด•เดฏเตเดณเตเดณเต‚.
  • เดชเดพเดฐเดฒเตฝ เดฎเต‹เดกเดฟเตฝ เดธเต€เด•เตเดตเตปเดทเตเดฏเตฝ เดŸเต‡เดฌเดฟเตพ เดธเตเด•เดพเตป เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต‡เด•เตเด•เดพเตพ เดšเดฟเดฒเดชเตเดชเต‹เตพ เดถเดฐเดฟเดฏเดพเดฏ เด‡เตปเดกเด•เตโ€Œเดธเดฟเด‚เด—เต เดจเดฒเตเดฒเดคเดพเดฃเต.
  • เดšเต‹เดฆเตเดฏเด™เตเด™เดณเตเด‚ เด•เดดเตโ€Œเดธเดฑเตเด•เดณเตเด‚ เดคเดพเตฝเด•เตเด•เดพเดฒเดฟเด•เดฎเดพเดฏเดฟ เดจเดฟเตผเดคเตเดคเตเดจเตเดจเดคเต เดชเดฟเดจเตเดคเตเดฃเดฏเตเด•เตเด•เตเดจเตเดจเดฟเดฒเตเดฒ.
  • เดตเดฟเตปเดกเต‹ เดซเด‚เด—เตโ€Œเดทเดจเตเด•เดณเตเด‚ เด“เตผเดกเตผ เดšเต†เดฏเตโ€Œเดค เดธเต†เดฑเตเดฑเต เด…เด—เตเดฐเด—เต‡เดฑเตเดฑเต เดซเด‚เด—เตโ€Œเดทเดจเตเด•เดณเตเด‚ เดธเดฎเดพเดจเตเดคเดฐเดฎเดฒเตเดฒ.
  • I/O เดœเต‹เดฒเดฟเดญเดพเดฐเดคเตเดคเดฟเตฝ เดจเดฟเด™เตเด™เตพ เด’เดจเตเดจเตเด‚ เดจเต‡เดŸเตเดจเตเดจเดฟเดฒเตเดฒ.
  • เดธเดฎเดพเดจเตเดคเดฐ เดธเต‹เตผเดŸเตเดŸเดฟเด‚เด—เต เด…เตฝเด—เต‹เดฐเดฟเดคเด™เตเด™เตพ เด’เดจเตเดจเตเดฎเดฟเดฒเตเดฒ. เดŽเดจเตเดจเดพเตฝ เดคเดฐเด™เตเด™เดณเตเดณเตเดณ เด…เดจเตเดตเต‡เดทเดฃเด™เตเด™เตพ เดšเดฟเดฒ เดตเดถเด™เตเด™เดณเดฟเตฝ เดธเดฎเดพเดจเตเดคเดฐเดฎเดพเดฏเดฟ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚.
  • เดธเดฎเดพเดจเตเดคเดฐ เดชเตเดฐเต‹เดธเดธเตเดธเดฟเด‚เด—เต เดชเตเดฐเดตเตผเดคเตเดคเดจเด•เตเดทเดฎเดฎเดพเด•เตเด•เดพเตป CTE (WITH ...) เดจเต†เดธเตเดฑเตเดฑเดกเต SELECT เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดฎเดพเดฑเตเดฑเดฟเดธเตเดฅเดพเดชเดฟเด•เตเด•เตเด•.
  • เดฎเต‚เดจเตเดจเดพเด‚ เด•เด•เตเดทเดฟ เดกเดพเดฑเตเดฑ เดฑเดพเดชเตเดชเดฑเตเด•เตพ เด‡เดคเตเดตเดฐเต† เดธเดฎเดพเดจเตเดคเดฐ เดชเตเดฐเต‹เดธเดธเตเดธเดฟเด‚เด—เดฟเดจเต† เดชเดฟเดจเตเดคเตเดฃเดฏเตเด•เตเด•เตเดจเตเดจเดฟเดฒเตเดฒ (เดชเด•เตเดทเต‡ เด…เดตเตผเด•เตเด•เต เด•เดดเดฟเดฏเตเด‚!)
  • เดซเตเตพ เด”เดŸเตเดŸเตผ เดœเต‹เดฏเดฟเตป เดชเดฟเดจเตเดคเตเดฃเดฏเตเด•เตเด•เตเดจเตเดจเดฟเดฒเตเดฒ.
  • max_rows เดธเดฎเดพเดจเตเดคเดฐ เดชเตเดฐเต‹เดธเดธเตเดธเดฟเด‚เด—เต เดชเตเดฐเดตเตผเดคเตเดคเดจเดฐเดนเดฟเดคเดฎเดพเด•เตเด•เตเดจเตเดจเต.
  • เด’เดฐเต เดšเต‹เดฆเตเดฏเดคเตเดคเดฟเดจเต เดชเดพเดฐเดฒเตฝ เดธเต‡เดซเต เดŽเดจเตเดจเต เด…เดŸเดฏเดพเดณเดชเตเดชเต†เดŸเตเดคเตเดคเดฟเดฏเดฟเดŸเตเดŸเดฟเดฒเตเดฒเดพเดคเตเดค เด’เดฐเต เดซเด‚เด—เตโ€Œเดทเตป เด‰เดฃเตเดŸเต†เด™เตเด•เดฟเตฝ, เด…เดคเต เด’เดฑเตเดฑ เดคเตเดฐเต†เดกเต เด†เดฏเดฟเดฐเดฟเด•เตเด•เตเด‚.
  • SERIALISABLE เดŸเตเดฐเดพเตปเดธเดพเด•เตเดทเตป เดเดธเตŠเดฒเต‡เดทเตป เดฒเต†เดตเตฝ เดธเดฎเดพเดจเตเดคเดฐ เดชเตเดฐเต‹เดธเดธเตเดธเดฟเด‚เด—เต เดชเตเดฐเดตเตผเดคเตเดคเดจเดฐเดนเดฟเดคเดฎเดพเด•เตเด•เตเดจเตเดจเต.

เดŸเต†เดธเตเดฑเตเดฑเต เดชเดฐเดฟเดธเตเดฅเดฟเดคเดฟ

PostgreSQL เดกเดตเดฒเดชเตเดชเตผเดฎเดพเตผ TPC-H เดฌเต†เดžเตเดšเตเดฎเดพเตผเด•เตเด•เต เดšเต‹เดฆเตเดฏเด™เตเด™เดณเตเดŸเต† เดชเตเดฐเดคเดฟเด•เดฐเดฃ เดธเดฎเดฏเด‚ เด•เตเดฑเดฏเตเด•เตเด•เดพเตป เดถเตเดฐเดฎเดฟเดšเตเดšเต. เดฌเต†เดžเตเดšเตเดฎเดพเตผเด•เตเด•เต เดกเต—เตบเดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเด• เด’เดชเตเดชเด‚ PostgreSQL-เดฒเต‡เด•เตเด•เต เด‡เดคเต เดชเตŠเดฐเตเดคเตเดคเดชเตเดชเต†เดŸเตเดคเตเดคเตเด•. เด‡เดคเต TPC-H เดฌเต†เดžเตเดšเตโ€Œเดฎเดพเตผเด•เตเด•เดฟเดจเตเดฑเต† เด…เดจเต—เดฆเตเดฏเต‹เด—เดฟเด• เด‰เดชเดฏเต‹เด—เดฎเดพเดฃเต - เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเดฟเดจเต‹ เดนเดพเตผเดกเตโ€Œเดตเต†เดฏเตผ เดคเดพเดฐเดคเดฎเตเดฏเดคเตเดคเดฟเดจเต‹ เดตเต‡เดฃเตเดŸเดฟเดฏเดฒเตเดฒ.

  1. TPC-H_Tools_v2.17.3.zip (เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดชเตเดคเดฟเดฏ เดชเดคเดฟเดชเตเดชเต) เดกเต—เตบเดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเด• เดŸเดฟเดชเดฟเดธเดฟ เด“เดซเตเดธเตˆเดฑเตเดฑเดฟเตฝ เดจเดฟเดจเตเดจเต.
  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.

เดชเดพเดฐเดฒเตฝ เดธเต€เด•เตเดตเตปเดทเตเดฏเตฝ เดธเตเด•เดพเดจเดฟเด‚เด—เต

เดชเดพเดฐเดฒเตฝ เดฑเต€เดกเดฟเด‚เด—เต เด•เตŠเดฃเตเดŸเดฒเตเดฒ, เดชเดฒ เดธเดฟเดชเดฟเดฏเต เด•เต‹เดฑเตเด•เดณเดฟเดฒเตเดŸเดจเต€เดณเด‚ เดกเดพเดฑเตเดฑ เดตเตเดฏเดพเดชเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเดพเตฝ เด‡เดคเต เดตเต‡เด—เดคเดฏเต‡เดฑเดฟเดฏเดคเดพเด•เดพเด‚. เด†เดงเตเดจเดฟเด• เด“เดชเตเดชเดฑเต‡เดฑเตเดฑเดฟเด‚เด—เต เดธเดฟเดธเตเดฑเตเดฑเด™เตเด™เดณเดฟเตฝ, 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

เดธเดฎเดพเดจเตเดคเดฐ เดธเดฎเดพเดนเดฐเดฃเด‚

เดชเดพเดฐเดฒเตฝ เดธเต†เด•เต เดธเตเด•เดพเตป เดจเต‹เดกเต เดญเดพเด—เดฟเด• เด…เด—เตเดฐเด—เต‡เดทเดจเดพเดฏเดฟ เดตเดฐเดฟเด•เตพ เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เตเดจเตเดจเต. "เดญเดพเด—เดฟเด• เด…เด—เตเดฐเด—เต‡เดฑเตเดฑเต" เดจเต‹เดกเต เดˆ เดตเดฐเดฟเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดŸเตเดฐเดฟเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต SUM(). เด…เดตเดธเดพเดจเด‚, เด“เดฐเต‹ เดคเตŠเดดเดฟเดฒเดพเดณเดฟ เดชเตเดฐเด•เตเดฐเดฟเดฏเดฏเดฟเตฝ เดจเดฟเดจเตเดจเตเด‚ SUM เด•เต—เดฃเตเดŸเตผ "Gather" เดจเต‹เดกเต เดถเต‡เด–เดฐเดฟเด•เตเด•เตเดจเตเดจเต.

เด…เดจเตเดคเดฟเดฎ เดซเดฒเด‚ เด•เดฃเด•เตเด•เดพเด•เตเด•เตเดจเตเดจเดคเต "เดซเตˆเดจเดฒเตˆเดธเต เด…เด—เตเดฐเด—เต‡เดฑเตเดฑเต" เดจเต‹เดกเต เด†เดฃเต. เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดธเตเดตเดจเตเดคเดฎเดพเดฏเดฟ เด…เด—เตเดฐเด—เต‡เดทเตป เดซเด‚เด—เตโ€Œเดทเดจเตเด•เตพ เด‰เดฃเตเดŸเต†เด™เตเด•เดฟเตฝ, เด…เดตเดฏเต† "เดธเดฎเดพเดจเตเดคเดฐ เดธเตเดฐเด•เตเดทเดฟเดคเด‚" เดŽเดจเตเดจเต เด…เดŸเดฏเดพเดณเดชเตเดชเต†เดŸเตเดคเตเดคเดพเตป เดฎเดฑเด•เตเด•เดฐเตเดคเต.

เดคเตŠเดดเดฟเดฒเดพเดณเดฟ เดชเตเดฐเด•เตเดฐเดฟเดฏเด•เดณเตเดŸเต† เดŽเดฃเตเดฃเด‚

เดธเต†เตผเดตเตผ เดชเตเดจเดฐเดพเดฐเด‚เดญเดฟเด•เตเด•เดพเดคเต† เดคเดจเตเดจเต† เดคเตŠเดดเดฟเดฒเดพเดณเดฟ เดชเตเดฐเด•เตเดฐเดฟเดฏเด•เดณเตเดŸเต† เดŽเดฃเตเดฃเด‚ เดตเตผเดฆเตเดงเดฟเดชเตเดชเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚:

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: เดœเต‹เดฒเดฟ เดชเตเดฐเด•เตเดฐเดฟเดฏเด•เดณเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เดŸเตเดฏเต‚เดชเตเดชเดฟเดณเตเด•เดณเตเดŸเต† เดŽเดฃเตเดฃเดคเตเดคเดฟเดจเต เด†เดจเตเดชเดพเดคเดฟเด•เดฎเดพเดฏเดฟ เดจเต‡เดคเดพเดตเตเด‚ เดคเตŠเดดเดฟเดฒเดพเดณเดฟเด•เดณเตเด‚ เดคเดฎเตเดฎเดฟเดฒเตเดณเตเดณ เด†เดถเดฏเดตเดฟเดจเดฟเดฎเดฏเด‚ เดตเตˆเด•เดพเด‚. เดˆ เดชเดฐเดพเดฎเต€เดฑเตเดฑเตผ เดกเดพเดฑเตเดฑเดพ เดŽเด•เตเดธเตเดšเต‡เดžเตเดšเต เดšเต†เดฒเดตเต เด•เดฃเด•เตเด•เดพเด•เตเด•เตเดจเตเดจเต.

เดจเต†เดธเตเดฑเตเดฑเดกเต เดฒเต‚เดชเตเดชเต เดšเต‡เดฐเตเดจเตเดจเต

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 เดŽเดฒเตเดฒเดพ เดšเต‹เดฆเตเดฏเด™เตเด™เดณเดฟเดฒเตเด‚ เด‡เดคเต เดธเดพเดงเดพเดฐเดฃเดฏเดพเดฏเดฟ เดธเด‚เดญเดตเดฟเด•เตเด•เตเดจเตเดจเต. เดชเต‹เดฐเดพเดฏเตเดฎ เด•เตเดฑเดžเตเดž เดธเดฎเดพเดจเตเดคเดฐเดคเดฏเดพเดฃเต, เด•เดพเดฐเดฃเด‚ เด“เดฐเต‹ เดคเตŠเดดเดฟเดฒเดพเดณเดฟ เดชเตเดฐเด•เตเดฐเดฟเดฏเดฏเตเด‚ 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 - เดธเต†เตผเดตเดฑเดฟเดฒเต† เดธเดฟเดชเดฟเดฏเต เด•เต‹เดฑเตเด•เดณเตเดŸเต† เดŽเดฃเตเดฃเดตเตเดฎเดพเดฏเดฟ เดตเตผเด•เตเด•เตผ เดชเตเดฐเต‹เดธเดธเตเดธเตเด•เดณเตเดŸเต† เด†เด•เต† เดŽเดฃเตเดฃเด‚ เด•เตเดฐเดฎเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเต.
  • max_parallel_workers - เดธเดฎเดพเดจเดฎเดพเดฃเต, เดŽเดจเตเดจเดพเตฝ เดธเดฎเดพเดจเตเดคเดฐ เดœเต‹เดฒเดฟ เดชเตเดฐเด•เตเดฐเดฟเดฏเด•เตพเด•เตเด•เต.

เดซเดฒเด™เตเด™เตพ

เดชเดคเดฟเดชเตเดชเต 9.6 เดชเต‹เดฒเต†, เดธเดฎเดพเดจเตเดคเดฐ เดชเตเดฐเต‹เดธเดธเตเดธเดฟเด‚เด—เดฟเดจเต เดจเดฟเดฐเดตเดงเดฟ เดตเดฐเดฟเด•เตพ เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดธเต‚เดšเดฟเด•เด•เตพ เดธเตเด•เดพเตป เดšเต†เดฏเตเดฏเตเดจเตเดจ เดธเด™เตเด•เต€เตผเดฃเตเดฃเดฎเดพเดฏ เด…เดจเตเดตเต‡เดทเดฃเด™เตเด™เดณเตเดŸเต† เดชเตเดฐเด•เดŸเดจเด‚ เดตเดณเดฐเต†เดฏเดงเดฟเด•เด‚ เดฎเต†เดšเตเดšเดชเตเดชเต†เดŸเตเดคเตเดคเดพเตป เด•เดดเดฟเดฏเตเด‚. PostgreSQL 10-เตฝ, เดธเดฎเดพเดจเตเดคเดฐ เดชเตเดฐเต‹เดธเดธเตเดธเดฟเด‚เด—เต เดธเตเดฅเดฟเดฐเดธเตเดฅเดฟเดคเดฟเดฏเดพเดฏเดฟ เดชเตเดฐเดตเตผเดคเตเดคเดจเด•เตเดทเดฎเดฎเดพเด•เตเด•เดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต. เดตเดฒเดฟเดฏ OLTP เดœเต‹เดฒเดฟเดญเดพเดฐเดฎเตเดณเตเดณ เดธเต†เตผเดตเดฑเตเด•เดณเดฟเตฝ เด‡เดคเต เดชเตเดฐเดตเตผเดคเตเดคเดจเดฐเดนเดฟเดคเดฎเดพเด•เตเด•เดพเตป เด“เตผเด•เตเด•เตเด•. เดคเตเดŸเตผเดšเตเดšเดฏเดพเดฏ เดธเตเด•เดพเดจเตเด•เตพ เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เด‡เตปเดกเด•เตเดธเต เดธเตเด•เดพเดจเตเด•เตพ เดงเดพเดฐเดพเดณเด‚ เดตเดฟเดญเดตเด™เตเด™เตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต. เดฎเตเดดเตเดตเตป เดกเดพเดฑเตเดฑเดพเดธเต†เดฑเตเดฑเดฟเดฒเตเด‚ เดจเดฟเด™เตเด™เตพ เด’เดฐเต เดฑเดฟเดชเตเดชเต‹เตผเดŸเตเดŸเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเดฟเดฒเตเดฒเต†เด™เตเด•เดฟเตฝ, เดจเดทเตโ€ŒเดŸเดฎเดพเดฏ เดธเต‚เดšเดฟเด•เด•เตพ เดšเต‡เตผเดคเตเดคเต‹ เดถเดฐเดฟเดฏเดพเดฏ เดชเดพเตผเดŸเตเดŸเต€เดทเดจเดฟเด‚เด—เต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต‹ เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด…เดจเตเดตเต‡เดทเดฃ เดชเตเดฐเด•เดŸเดจเด‚ เดฎเต†เดšเตเดšเดชเตเดชเต†เดŸเตเดคเตเดคเดพเด‚.

เดฑเต†เดซเดฑเตปเดธเตเด•เตพ

เด…เดตเดฒเด‚เดฌเด‚: www.habr.com

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•