PostgreSQL, ClickHouse เช…เชจเซ‡ clickhousedb_fdw (PostgreSQL) เชฎเชพเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃเชพเชคเซเชฎเช• เชชเซเชฐเชถเซเชจเซ‹เชจเชพ เชชเซเชฐเชฆเชฐเซเชถเชจเชจเซเช‚ เชชเชฐเซ€เช•เซเชทเชฃ เช•เชฐเชตเซเช‚

เช† เช…เชญเซเชฏเชพเชธเชฎเชพเช‚, เชนเซเช‚ เช เชœเซ‹เชตเชพ เชฎเชพเช‚เช—เชคเซ‹ เชนเชคเซ‹ เช•เซ‡ PostgreSQL เชจเซ‡ เชฌเชฆเชฒเซ‡ ClickHouse เชกเซ‡เชŸเชพ เชธเซเชคเซเชฐเซ‹เชคเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช•เชฏเชพ เชชเซเชฐเชฆเชฐเซเชถเชจ เชธเซเชงเชพเชฐเชฃเชพเช“ เชชเซเชฐเชพเชชเซเชค เช•เชฐเซ€ เชถเช•เชพเชฏ. เช•เซเชฒเชฟเช•เชนเชพเช‰เชธเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชฅเซ€ เชฎเชจเซ‡ เชœเซ‡ เช‰เชคเซเชชเชพเชฆเช•เชคเชพ เชฒเชพเชญเซ‹ เชฎเชณเซ‡ เช›เซ‡ เชคเซ‡ เชนเซเช‚ เชœเชพเชฃเซเช‚ เช›เซเช‚. เชœเซ‹ เชนเซเช‚ เชซเซ‹เชฐเซ‡เชจ เชกเซ‡เชŸเชพ เชฐเซ‡เชชเชฐ (FDW) เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ PostgreSQL เชฎเชพเช‚เชฅเซ€ ClickHouse เชจเซ‡ เชเช•เซเชธเซ‡เชธ เช•เชฐเซเช‚ เชคเซ‹ เชถเซเช‚ เช† เชฒเชพเชญเซ‹ เชšเชพเชฒเซ เชฐเชนเซ‡เชถเซ‡?

เช…เชญเซเชฏเชพเชธ เช•เชฐเซ‡เชฒ เชกเซ‡เชŸเชพเชฌเซ‡เช เชชเชฐเซเชฏเชพเชตเชฐเชฃเซ‹ PostgreSQL v11, clickhousedb_fdw เช…เชจเซ‡ ClickHouse เชกเซ‡เชŸเชพเชฌเซ‡เช เช›เซ‡. เช†เช–เชฐเซ‡, PostgreSQL v11 เชฅเซ€ เช…เชฎเซ‡ เช…เชฎเชพเชฐเชพ clickhousedb_fdw เชฆเซเชตเชพเชฐเชพ ClickHouse เชกเซ‡เชŸเชพเชฌเซ‡เช เชชเชฐ เชฐเซ‚เชŸ เช•เชฐเชพเชฏเซ‡เชฒ เชตเชฟเชตเชฟเชง SQL เช•เซเชตเซ‡เชฐเซ€เช เชšเชฒเชพเชตเซ€เชถเซเช‚. เช…เชฎเซ‡ เชชเช›เซ€ เชœเซ‹เชˆเชถเซเช‚ เช•เซ‡ FDW เชจเซเช‚ เชชเซเชฐเชฆเชฐเซเชถเชจ เชฎเซ‚เชณ PostgreSQL เช…เชจเซ‡ เชฎเซ‚เชณ เช•เซเชฒเชฟเช•เชนเชพเช‰เชธเชฎเชพเช‚ เชšเชพเชฒเชคเซ€ เชธเชฎเชพเชจ เช•เซเชตเซ‡เชฐเซ€เช เชธเชพเชฅเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชธเชฐเช–เชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡.

เช•เซเชฒเชฟเช•เชนเชพเช‰เชธ เชกเซ‡เชŸเชพเชฌเซ‡เช

เช•เซเชฒเชฟเช•เชนเชพเช‰เชธ เช เช“เชชเชจ เชธเซ‹เชฐเซเชธ เช•เซ‹เชฒเชฎเชฐ เชกเซ‡เชŸเชพเชฌเซ‡เช เชฎเซ‡เชจเซ‡เชœเชฎเซ‡เชจเซเชŸ เชธเชฟเชธเซเชŸเชฎ เช›เซ‡ เชœเซ‡ เชชเชฐเช‚เชชเชฐเชพเช—เชค เชกเซ‡เชŸเชพเชฌเซ‡เช เช…เชญเชฟเช—เชฎเซ‹ เช•เชฐเชคเชพเช‚ 100-1000 เช—เชฃเซ€ เชเชกเชชเซ€ เช•เชพเชฎเช—เซ€เชฐเซ€ เชนเชพเช‚เชธเชฒ เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡, เชœเซ‡ เชเช• เชธเซ‡เช•เชจเซเชก เช•เชฐเชคเชพเช‚ เช“เช›เชพ เชธเชฎเชฏเชฎเชพเช‚ เชเช• เช…เชฌเชœ เชชเช‚เช•เซเชคเชฟเช“ เชชเชฐ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช•เชฐเชตเชพเชฎเชพเช‚ เชธเช•เซเชทเชฎ เช›เซ‡.

Clickhousedb_fdw

clickhousedb_fdw - เช•เซเชฒเชฟเช•เชนเชพเช‰เชธ เชกเซ‡เชŸเชพเชฌเซ‡เช เชฎเชพเชŸเซ‡ เชฌเชพเชนเซเชฏ เชกเซ‡เชŸเชพ เชฐเซ‡เชชเชฐ, เช…เชฅเชตเชพ FDW, เชชเชฐเช•เซ‹เชจเชพเชจเซ‹ เชเช• เช“เชชเชจ เชธเซ‹เชฐเซเชธ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เช›เซ‡. เช…เชนเซ€เช‚ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเชจเชพ GitHub เชญเช‚เชกเชพเชฐเชจเซ€ เชฒเชฟเช‚เช• เช›เซ‡.

เชฎเชพเชฐเซเชšเชฎเชพเช‚ เชฎเซ‡เช‚ เชเช• เชฌเซเชฒเซ‹เช— เชฒเช–เซเชฏเซ‹ เชนเชคเซ‹ เชœเซ‡ เชคเชฎเชจเซ‡ เช…เชฎเชพเชฐเชพ FDW เชตเชฟเชถเซ‡ เชตเชงเซ เชœเชฃเชพเชตเซ‡ เช›เซ‡.

เชคเชฎเซ‡ เชœเซ‹เชถเซ‹ เชคเซ‡เชฎ, เช† ClickHouse เชฎเชพเชŸเซ‡ FDW เชชเซเชฐเชฆเชพเชจ เช•เชฐเซ‡ เช›เซ‡ เชœเซ‡ PostgreSQL v11 เชธเชฐเซเชตเชฐเชฎเชพเช‚เชฅเซ€ ClickHouse เชกเซ‡เชŸเชพเชฌเซ‡เชเชฎเชพเช‚เชฅเซ€ SELECT, เช…เชจเซ‡ INSERT INTO เชจเซ‡ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡.

FDW เช…เชฆเซเชฏเชคเชจ เชธเซเชตเชฟเชงเชพเช“เชจเซ‡ เชธเชชเซ‹เชฐเซเชŸ เช•เชฐเซ‡ เช›เซ‡ เชœเซ‡เชฎ เช•เซ‡ เชเช—เซเชฐเซ€เช—เซ‡เชŸ เช…เชจเซ‡ เชœเซ‹เชกเชพเช“. เช† เชธเช‚เชธเชพเชงเชจ-เชธเช˜เชจ เช•เชพเชฎเช—เซ€เชฐเซ€ เชฎเชพเชŸเซ‡ เชฐเชฟเชฎเซ‹เชŸ เชธเชฐเซเชตเชฐเชจเชพ เชธเช‚เชธเชพเชงเชจเซ‹เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชชเซเชฐเชญเชพเชตเชจเซ‡ เชจเซ‹เช‚เชงเชชเชพเชคเซเชฐ เชฐเซ€เชคเซ‡ เชธเซเชงเชพเชฐเซ‡ เช›เซ‡.

เชฌเซ‡เชจเซเชšเชฎเชพเชฐเซเช• เชชเชฐเซเชฏเชพเชตเชฐเชฃ

  • เชธเซเชชเชฐเชฎเชพเช‡เช•เซเชฐเซ‹ เชธเชฐเซเชตเชฐ:
    • Intelยฎ Xeonยฎ CPU E5-2683 v3 @ 2.00GHz
    • 2 เชธเซ‹เช•เซ‡เชŸเซเชธ / 28 เช•เซ‹เชฐเซ‹ / 56 เชฅเซเชฐเซ‡เชกเซ‹
    • เชฎเซ‡เชฎเชฐเซ€: 256 เชœเซ€เชฌเซ€ เชฐเซ‡เชฎ
    • เชธเช‚เช—เซเชฐเชน: Samsung SM863 1.9TB Enterprise SSD
    • เชซเชพเช‡เชฒเชธเชฟเชธเซเชŸเชฎ: ext4/xfs
  • OS: Linux smblade01 4.15.0-42-generic #45~16.04.1-Ubuntu
  • เชชเซ‹เชธเซเชŸเช—เซเชฐเซ‡เชเชธเช•เซเชฏเซเชเชฒ: เชธเช‚เชธเซเช•เชฐเชฃ 11

เชฌเซ‡เชจเซเชšเชฎเชพเชฐเซเช• เชชเชฐเซ€เช•เซเชทเชฃเซ‹

เช† เชชเชฐเซ€เช•เซเชทเชฃ เชฎเชพเชŸเซ‡ เช•เซ‡เชŸเชฒเชพเช• เชฎเชถเซ€เชจ-เชœเชจเชฐเซ‡เชŸเซ‡เชก เชกเซ‡เชŸเชพ เชธเซ‡เชŸเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเซ‡ เชฌเชฆเชฒเซ‡, เช…เชฎเซ‡ 1987 เชฅเซ€ 2018 เชธเซเชงเซ€เชจเชพ "เชธเชฎเชฏเชจเซ€ เชœเชพเชฃ เช•เชฐเซ‡เชฒ เช“เชชเชฐเซ‡เชŸเชฐ เชธเชฎเชฏ เชฆเซเชตเชพเชฐเชพ เช‰เชคเซเชชเชพเชฆเช•เชคเชพ" เชกเซ‡เชŸเชพเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซเชฏเซ‹. เชคเชฎเซ‡ เชกเซ‡เชŸเชพ เชเช•เซเชธเซ‡เชธ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹ เช…เชนเซ€เช‚ เช‰เชชเชฒเชฌเซเชง เช…เชฎเชพเชฐเซ€ เชธเซเช•เซเชฐเชฟเชชเซเชŸเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡.

เชกเซ‡เชŸเชพเชฌเซ‡เชเชจเซเช‚ เช•เชฆ 85 GB เช›เซ‡, เชœเซ‡ 109 เช•เซ‰เชฒเชฎเชจเซเช‚ เชเช• เชŸเซ‡เชฌเชฒ เชชเซ‚เชฐเซเช‚ เชชเชพเชกเซ‡ เช›เซ‡.

เชฌเซ‡เชจเซเชšเชฎเชพเชฐเซเช• เช•เซเชตเซ‡เชฐเซ€เช

เช•เซเชฒเชฟเช•เชนเชพเช‰เชธ, clickhousedb_fdw เช…เชจเซ‡ PostgreSQL เชจเซ€ เชธเชฐเช–เชพเชฎเชฃเซ€ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชฎเซ‡เช‚ เช‰เชชเชฏเซ‹เช—เชฎเชพเช‚ เชฒเซ€เชงเซ‡เชฒเซ€ เช•เซเชตเซ‡เชฐเซ€เช เช…เชนเซ€เช‚ เช›เซ‡.

Q#
เช•เซเชตเซ‡เชฐเซ€ เชเช—เซเชฐเซ€เช—เซ‡เชŸเซเชธ เช…เชจเซ‡ เช—เซเชฐเซ‚เชช เชฆเซเชตเชพเชฐเชพ เชธเชฎเชพเชตเซ‡ เช›เซ‡

Q1
เช…เช เชตเชพเชกเชฟเชฏเซ‡ เชฆเชฟเชตเชธ เชชเชธเช‚เชฆ เช•เชฐเซ‹, เช“เชจเชŸเชพเช‡เชฎเชฅเซ€ c เชคเชฐเซ€เช•เซ‡ เช—เชฃเซ‹ (*) เชœเซเชฏเชพเช‚ เชตเชฐเซเชท >= 2000 เช…เชจเซ‡ เชตเชฐเซเชท <= 2008 เช—เซเชฐเซ‚เชช เชฌเชพเชฏ เชกเซ‡เช“เชซ เชตเซ€เช•เชจเชพ เช•เซเชฐเชฎเชฎเชพเช‚ c DESC เชฆเซเชตเชพเชฐเชพ;

Q2
เช…เช เชตเชพเชกเชฟเชฏเซ‡ เชฆเชฟเชตเชธ เชชเชธเช‚เชฆ เช•เชฐเซ‹, เช“เชจเชŸเชพเช‡เชฎเชฅเซ€ c เชคเชฐเซ€เช•เซ‡ เช—เชฃเซ‹ (*) เชœเซเชฏเชพเช‚ DepDelay>10 เช…เชจเซ‡ เชตเชฐเซเชท >= 2000 เช…เชจเซ‡ เชตเชฐเซเชท <= 2008 เช—เซเชฐเซ‚เชช เชฌเชพเชฏ เชกเซ‡เช“เชซ เชตเซ€เช• เช“เชฐเซเชกเชฐ c DESC เชฆเซเชตเชพเชฐเชพ;

Q3
เช“เชฐเชฟเชœเชฟเชจ เชชเชธเช‚เชฆ เช•เชฐเซ‹, เช“เชจเชŸเชพเช‡เชฎเชฅเซ€ เช—เชฃเชคเชฐเซ€ เช•เชฐเซ‹ (*) เชœเซเชฏเชพเช‚ DepDelay>10 เช…เชจเซ‡ เชตเชฐเซเชท >= 2000 เช…เชจเซ‡ เชตเชฐเซเชท <= 2008 เช—เซเชฐเซ‚เชช เช‘เชฐเชฟเชœเชฟเชจ เช‘เชฐเซเชกเชฐ C DESC LIMIT 10 เชฆเซเชตเชพเชฐเชพ;

Q4
เชตเชพเชนเช• เชชเชธเช‚เชฆ เช•เชฐเซ‹, เช—เชฃเชคเชฐเซ€() เช“เชจเชŸเชพเช‡เชฎเชฅเซ€ เชœเซเชฏเชพเช‚ เชตเชฟเชฒเช‚เชฌ> 10 เช…เชจเซ‡ เชตเชฐเซเชท = 2007 เชœเซ‚เชฅ เชตเชพเชนเช• เชฆเซเชตเชพเชฐเชพ เช—เชฃเชคเชฐเซ€ เชฆเซเชตเชพเชฐเชพ เช“เชฐเซเชกเชฐ() DESC;

Q5
เชชเชธเช‚เชฆ เช•เชฐเซ‹ a.เชตเชพเชนเช•, c, c2, c1000/c2 FROM c3 เชคเชฐเซ€เช•เซ‡ ( เช•เซ‡เชฐเชฟเชฏเชฐ เชชเชธเช‚เชฆ เช•เชฐเซ‹, เช—เชฃเชคเชฐเซ€ () เช“เชจเชŸเชพเช‡เชฎเชฅเซ€ เชœเซเชฏเชพเช‚ เชตเชฟเชฒเช‚เชฌ> 10 เช…เชจเซ‡ เชตเชฐเซเชท = 2007 เชตเชพเชนเช• เชฆเซเชตเชพเชฐเชพ เชœเซ‚เชฅ C2 DESC เชฆเซเชตเชพเชฐเชพ;

Q6
เชชเชธเช‚เชฆ เช•เชฐเซ‹ a.เชตเชพเชนเช•, c, c2, c1000/c2 FROM c3 เชคเชฐเซ€เช•เซ‡ ( เช•เซ‡เชฐเชฟเชฏเชฐ เชชเชธเช‚เชฆ เช•เชฐเซ‹, เช—เชฃเชคเชฐเซ€ () เช“เชจเชŸเชพเช‡เชฎเชฅเซ€ c เชคเชฐเซ€เช•เซ‡ เชœเซเชฏเชพเช‚ เชตเชฟเชฒเช‚เชฌ> 10 เช…เชจเซ‡ เชตเชฐเซเชท >= 2000 เช…เชจเซ‡ เชตเชฐเซเชท <= เชตเชพเชนเช• เชฆเซเชตเชพเชฐเชพ 2008 เชœเซ‚เชฅ) เชเช• เช†เช‚เชคเชฐเชฟเช• เชœเซ‹เชกเชพเช“ ( เช•เซ‡เชฐเชฟเชฏเชฐ เชชเชธเช‚เชฆ เช•เชฐเซ‹, เช—เชฃเชคเชฐเซ€ เช•เชฐเซ‹ (*) เช“เชจเชŸเชพเช‡เชฎเชฅเซ€ c2 เชคเชฐเซ€เช•เซ‡ เชœเซเชฏเชพเช‚ เชตเชฐเซเชท >= 2000 เช…เชจเซ‡ เชตเชฐเซเชท <= 2008 เช•เซ‡เชฐเชฟเชฏเชฐ ) b เชชเชฐ a.Carrier=b.Carrier ORDER by c3 DESC;

Q7
เชตเชพเชนเช• เชชเชธเช‚เชฆ เช•เชฐเซ‹, เชธเชฐเซ‡เชฐเชพเชถ(DepDelay) * 1000 AS c3 เช“เชจเชŸเชพเช‡เชฎ เชœเซเชฏเชพเช‚ เชตเชฐเซเชท >= 2000 เช…เชจเซ‡ เชตเชฐเซเชท <= 2008 เช—เซเชฐเซ‚เชช เชฌเชพเชฏ เช•เซ‡เชฐเชฟเชฏเชฐ;

Q8
เชตเชฐเซเชท เชชเชธเช‚เชฆ เช•เชฐเซ‹, เชธเชฐเซ‡เชฐเชพเชถ(DepDelay) เช“เชจเชŸเชพเช‡เชฎเชฅเซ€ เช—เซเชฐเซ‚เชช เชฌเชพเชฏ เชตเชฐเซเชท;

Q9
เชตเชฐเซเชท เชชเชธเช‚เชฆ เช•เชฐเซ‹, เชตเชฐเซเชท เชฆเซเชตเชพเชฐเชพ เช‘เชจเชŸเชพเช‡เชฎ เชœเซ‚เชฅเชฎเชพเช‚เชฅเซ€ c1 เชคเชฐเซ€เช•เซ‡ เช—เชฃเซ‹ (*);

Q10
เชธเชฐเซ‡เชฐเชพเชถ (cnt) เชฎเชพเช‚เชฅเซ€ เชชเชธเช‚เชฆ เช•เชฐเซ‹ (เชตเชฐเซเชท, เชฎเชนเชฟเชจเซ‹, เช—เชฃเชคเชฐเซ€ (*) เช“เชจเชŸเชพเช‡เชฎเชฅเซ€ cnt เชคเชฐเซ€เช•เซ‡ เชชเชธเช‚เชฆ เช•เชฐเซ‹ เชœเซเชฏเชพเช‚ DepDel15=1 เชตเชฐเซเชท, เชฎเชนเชฟเชจเซ‹ เชฆเซเชตเชพเชฐเชพ เชœเซ‚เชฅ) a;

Q11
เชฎเชพเช‚เชฅเซ€ เชธเชฐเซ‡เชฐเชพเชถ(c1) เชชเชธเช‚เชฆ เช•เชฐเซ‹ (เชตเชฐเซเชท,เชฎเชนเชฟเชจเซ‹,เช—เชฃเชคเชฐเซ€(*) เชคเชฐเซ€เช•เซ‡ c1 เชคเชฐเซ€เช•เซ‡ เช“เชจเชŸเชพเช‡เชฎ เชœเซ‚เชฅเชฎเชพเช‚เชฅเซ€ เชตเชฐเซเชท,เชฎเชนเชฟเชจเชพ เชฆเซเชตเชพเชฐเชพ เชชเชธเช‚เชฆ เช•เชฐเซ‹) a;

Q12
OriginCityName, DestCityName, เช•เชพเช‰เชจเซเชŸ(*) เชคเชฐเซ€เช•เซ‡ เชชเชธเช‚เชฆ เช•เชฐเซ‹ เช“เชจเชŸเชพเช‡เชฎเชฅเซ€ เช—เซเชฐเซ‚เชช เชฆเซเชตเชพเชฐเชพ OriginCityName, DestCityName เช“เชฐเซเชกเชฐ เชธเซ€ DESC เชฒเชฟเชฎเชฟเชŸ 10 เชฆเซเชตเชพเชฐเชพ;

Q13
OriginCityName เชชเชธเช‚เชฆ เช•เชฐเซ‹, C DESC LIMIT 10 เชฆเซเชตเชพเชฐเชพ เช‘เชฐเชฟเชœเชฟเชจเชธเชฟเชŸเซ€เชจเชพเชฎ เชฆเซเชตเชพเชฐเชพ เช‘เชจเชŸเชพเช‡เชฎ เช—เซเชฐเซ‚เชช เชคเชฐเซ€เช•เซ‡ เช—เชฃเชคเชฐเซ€ เช•เชฐเซ‹

เช•เซเชตเซ‡เชฐเซ€ เชœเซ‹เชกเชพเช“ เชธเชฎเชพเชตเซ‡ เช›เซ‡

Q14
เชชเชธเช‚เชฆ เช•เชฐเซ‹ a.Year, c1/c2 FROM (เชตเชฐเซเชท เชชเชธเช‚เชฆ เช•เชฐเซ‹, เช—เชฃเชคเชฐเซ€()เช“เชจเชŸเชพเช‡เชฎเชฅเซ€ c1000 เชคเชฐเซ€เช•เซ‡ 1 เชœเซเชฏเชพเช‚ DepDelay>เชตเชฐเซเชท เชฆเซเชตเชพเชฐเชพ 10 เช—เซเชฐเซ‚เชช) เชเช• เช†เช‚เชคเชฐเชฟเช• เชœเซ‹เชกเชพเช“ (เชตเชฐเซเชท เชชเชธเช‚เชฆ เช•เชฐเซ‹, เชตเชฐเซเชท เชฆเซเชตเชพเชฐเชพ เช“เชจเชŸเชพเช‡เชฎ เช—เซเชฐเซเชชเชฎเชพเช‚เชฅเซ€ c2 เชคเชฐเซ€เช•เซ‡ เช—เชฃเซ‹) b เชชเชฐ a.Year=b.Year ORDER BY a.Year;

Q15
เชชเชธเช‚เชฆ เช•เชฐเซ‹ a.โ€เชตเชฐเซเชทโ€, c1/c2 FROM ( โ€œเชตเชฐเซเชทโ€ เชชเชธเช‚เชฆ เช•เชฐเซ‹, เช—เชฃเชคเชฐเซ€()เชซเซ‹เชจเซเชŸเชพเชˆเชฎเชฅเซ€ c1000 เชคเชฐเซ€เช•เซ‡ 1 เชœเซเชฏเชพเช‚ โ€œDepDelayโ€>10 เช—เซเชฐเซ‚เชช เชฌเชพเชฏ โ€œเชตเชฐเซเชทโ€) เชเช• เช†เช‚เชคเชฐเชฟเช• เชœเซ‹เชกเชพเช“ ("เชตเชฐเซเชท" เชชเชธเช‚เชฆ เช•เชฐเซ‹, "เชตเชฐเซเชท" เชฆเซเชตเชพเชฐเชพ เชซเซ‹เชจเซเชŸเชพเชˆเชฎ เช—เซเชฐเซเชชเชฎเชพเช‚เชฅเซ€ c2 เชคเชฐเซ€เช•เซ‡ เช—เชฃเซ‹ (*) ) b เชชเชฐ a.โ€Yearโ€=b. "เชตเชฐเซเชท";

เช•เซ‹เชทเซเชŸเช•-1: เชฌเซ‡เชจเซเชšเชฎเชพเชฐเซเช•เชฎเชพเช‚ เชตเชชเชฐเชพเชคเซ€ เช•เซเชตเซ‡เชฐเซ€

เช•เซเชตเซ‡เชฐเซ€ เช…เชฎเชฒ

เชœเซเชฏเชพเชฐเซ‡ เชตเชฟเชตเชฟเชง เชกเซ‡เชŸเชพเชฌเซ‡เช เชธเซ‡เชŸเชฟเช‚เช—เซเชธเชฎเชพเช‚ เชšเชฒเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เชคเซเชฏเชพเชฐเซ‡ เชฆเชฐเซ‡เช• เช•เซเชตเซ‡เชฐเซ€เชจเชพเช‚ เชชเชฐเชฟเชฃเชพเชฎเซ‹ เช…เชนเซ€เช‚ เช›เซ‡: เช…เชจเซเช•เซเชฐเชฎเชฃเชฟเช•เชพเช“ เชธเชพเชฅเซ‡ เช…เชจเซ‡ เชตเช—เชฐ PostgreSQL, เชฎเซ‚เชณ ClickHouse เช…เชจเซ‡ clickhousedb_fdw. เชธเชฎเชฏ เชฎเชฟเชฒเชฟเชธเซ‡เช•เช‚เชกเชฎเชพเช‚ เชฌเชคเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡.

Q#
เชชเซ‹เชธเซเชŸเช—เซเชฐเซ‡ เชเชธเช•เซเชฏเซเชเชฒ
PostgreSQL (เช…เชจเซเช•เซเชฐเชฎเชฟเชค)
เช•เซเชฒเซ€เช•เชนเชพเช‰เชธ
clickhousedb_fdw

Q1
27920
19634
23
57

Q2
35124
17301
50
80

Q3
34046
15618
67
115

Q4
31632
7667
25
37

Q5
47220
8976
27
60

Q6
58233
24368
55
153

Q7
30566
13256
52
91

Q8
38309
60511
112
179

Q9
20674
37979
31
81

Q10
34990
20102
56
148

Q11
30489
51658
37
155

Q12
39357
33742
186
1333

Q13
29912
30709
101
384

Q14
54126
39913
124
1364212

Q15
97258
30211
245
259

เช•เซ‹เชทเซเชŸเช•-1: เชฌเซ‡เชจเซเชšเชฎเชพเชฐเซเช•เชฎเชพเช‚ เชตเชชเชฐเชพเชคเซ€ เช•เซเชตเซ‡เชฐเซ€ เชšเชฒเชพเชตเชตเชพเชฎเชพเช‚ เชฒเชพเช—เซ‡เชฒเซ‹ เชธเชฎเชฏ

เชชเชฐเชฟเชฃเชพเชฎเซ‹ เชœเซเช“

เช†เชฒเซ‡เช– เช•เซเชตเซ‡เชฐเซ€ เชเช•เซเชเซ‡เช•เซเชฏเซเชถเชจเชจเซ‹ เชธเชฎเชฏ เชฎเชฟเชฒเซ€เชธเซ‡เช•เชจเซเชกเชฎเชพเช‚ เชฌเชคเชพเชตเซ‡ เช›เซ‡, X เช…เช•เซเชท เช‰เชชเชฐเชจเชพ เช•เซ‹เชทเซเชŸเช•เซ‹เชฎเชพเช‚เชฅเซ€ เช•เซเชตเซ‡เชฐเซ€ เชจเช‚เชฌเชฐ เชฌเชคเชพเชตเซ‡ เช›เซ‡ เช…เชจเซ‡ Y เช…เช•เซเชท เชฎเชฟเชฒเชฟเชธเซ‡เช•เชจเซเชกเชฎเชพเช‚ เชเช•เซเชเซ‡เช•เซเชฏเซเชถเชจเชจเซ‹ เชธเชฎเชฏ เชฌเชคเชพเชตเซ‡ เช›เซ‡. Clickhousedb_fdw เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชชเซ‹เชธเซเชŸเช—เซเชฐเซ‡เชธเชฎเชพเช‚เชฅเซ€ เชฎเซ‡เชณเชตเซ‡เชฒ เช•เซเชฒเชฟเช•เชนเชพเช‰เชธ เชชเชฐเชฟเชฃเชพเชฎเซ‹ เช…เชจเซ‡ เชกเซ‡เชŸเชพ เชฌเชคเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เช•เซ‹เชทเซเชŸเช•เชฎเชพเช‚เชฅเซ€ เชคเชฎเซ‡ เชœเซ‹เชˆ เชถเช•เซ‹ เช›เซ‹ เช•เซ‡ PostgreSQL เช…เชจเซ‡ ClickHouse เชตเชšเซเชšเซ‡ เช˜เชฃเซ‹ เชฎเซ‹เชŸเซ‹ เชคเชซเชพเชตเชค เช›เซ‡, เชชเชฐเช‚เชคเซ ClickHouse เช…เชจเซ‡ clickhousedb_fdw เชตเชšเซเชšเซ‡ เชจเซเชฏเซ‚เชจเชคเชฎ เชคเชซเชพเชตเชค เช›เซ‡.

PostgreSQL, ClickHouse เช…เชจเซ‡ clickhousedb_fdw (PostgreSQL) เชฎเชพเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃเชพเชคเซเชฎเช• เชชเซเชฐเชถเซเชจเซ‹เชจเชพ เชชเซเชฐเชฆเชฐเซเชถเชจเชจเซเช‚ เชชเชฐเซ€เช•เซเชทเชฃ เช•เชฐเชตเซเช‚

เช† เช—เซเชฐเชพเชซ ClickhouseDB เช…เชจเซ‡ clickhousedb_fdw เชตเชšเซเชšเซ‡เชจเซ‹ เชคเชซเชพเชตเชค เชฆเชฐเซเชถเชพเชตเซ‡ เช›เซ‡. เชฎเซ‹เชŸเชพเชญเชพเช—เชจเซ€ เช•เซเชตเซ‡เชฐเซ€เชเชฎเชพเช‚, FDW เช“เชตเชฐเชนเซ‡เชก เชเชŸเชฒเซเช‚ เชŠเช‚เชšเซเช‚ เชจเชฅเซ€ เช…เชจเซ‡ Q12 เชธเชฟเชตเชพเชฏ เชญเชพเช—เซเชฏเซ‡ เชœ เชจเซ‹เช‚เชงเชชเชพเชคเซเชฐ เช›เซ‡. เช† เช•เซเชตเซ‡เชฐเซ€ เชฎเชพเช‚ เชœเซ‹เชกเชพเชตเชพ เช…เชจเซ‡ เช“เชฐเซเชกเชฐ เชฌเชพเชฏ เช•เชฒเชฎเชจเซ‹ เชธเชฎเชพเชตเซ‡เชถ เชฅเชพเชฏ เช›เซ‡. ORDER BY GROUP/BY เช•เชฒเชฎเชจเซ‡ เช•เชพเชฐเชฃเซ‡, ORDER BY เช•เซเชฒเชฟเช•เชนเชพเช‰เชธ เชชเชฐ เชกเซเชฐเซ‹เชช เชกเชพเช‰เชจ เชฅเชคเซ‹ เชจเชฅเซ€.

เช•เซ‹เชทเซเชŸเช• 2 เชฎเชพเช‚ เช†เชชเชฃเซ‡ Q12 เช…เชจเซ‡ Q13 เชชเซเชฐเชถเซเชจเซ‹เชฎเชพเช‚ เชธเชฎเชฏเชจเซ‹ เช‰เช›เชพเชณเซ‹ เชœเซ‹เชˆเช เช›เซ€เช. เชซเชฐเซ€เชฅเซ€, เช† ORDER BY เช•เชฒเชฎเชจเซ‡ เช•เชพเชฐเชฃเซ‡ เชฅเชพเชฏ เช›เซ‡. เช†เชจเซ€ เชชเซเชทเซเชŸเชฟ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชฎเซ‡เช‚ ORDER BY เช•เชฒเชฎ เชธเชพเชฅเซ‡ เช…เชจเซ‡ เชคเซ‡เชจเชพ เชตเช—เชฐ Q-14 เช…เชจเซ‡ Q-15 เช•เซเชตเซ‡เชฐเซ€เช เชšเชฒเชพเชตเซ€. ORDER BY เช•เชฒเชฎ เชตเชฟเชจเชพ เชชเซ‚เชฐเซเชฃ เชฅเชตเชพเชจเซ‹ เชธเชฎเชฏ 259ms เช›เซ‡ เช…เชจเซ‡ ORDER BY เช•เชฒเชฎ เชธเชพเชฅเซ‡ เชคเซ‡ 1364212 เช›เซ‡. เช† เช•เซเชตเซ‡เชฐเซ€ เชกเซ€เชฌเช— เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชนเซเช‚ เชฌเช‚เชจเซ‡ เช•เซเชตเซ‡เชฐเซ€ เชธเชฎเชœเชพเชตเซเช‚ เช›เซเช‚ เช…เชจเซ‡ เช…เชนเซ€เช‚ เชธเชฎเชœเซ‚เชคเซ€เชจเชพ เชชเชฐเชฟเชฃเชพเชฎเซ‹ เช›เซ‡.

Q15: เช•เชฒเชฎ เชฆเซเชตเชพเชฐเชพ เช“เชฐเซเชกเชฐ เชตเชฟเชจเชพ

bm=# EXPLAIN VERBOSE SELECT a."Year", c1/c2 
     FROM (SELECT "Year", count(*)*1000 AS c1 FROM fontime WHERE "DepDelay" > 10 GROUP BY "Year") a
     INNER JOIN(SELECT "Year", count(*) AS c2 FROM fontime GROUP BY "Year") b ON a."Year"=b."Year";

เชชเซเชฐเชถเซเชจ15: เช•เชฒเชฎ เชฆเซเชตเชพเชฐเชพ เช“เชฐเซเชกเชฐ เชตเชฟเชจเชพ เชชเซเชฐเชถเซเชจ

QUERY PLAN                                                      
Hash Join  (cost=2250.00..128516.06 rows=50000000 width=12)  
Output: fontime."Year", (((count(*) * 1000)) / b.c2)  
Inner Unique: true   Hash Cond: (fontime."Year" = b."Year")  
->  Foreign Scan  (cost=1.00..-1.00 rows=100000 width=12)        
Output: fontime."Year", ((count(*) * 1000))        
Relations: Aggregate on (fontime)        
Remote SQL: SELECT "Year", (count(*) * 1000) FROM "default".ontime WHERE (("DepDelay" > 10)) GROUP BY "Year"  
->  Hash  (cost=999.00..999.00 rows=100000 width=12)        
Output: b.c2, b."Year"        
->  Subquery Scan on b  (cost=1.00..999.00 rows=100000 width=12)              
Output: b.c2, b."Year"              
->  Foreign Scan  (cost=1.00..-1.00 rows=100000 width=12)                    
Output: fontime_1."Year", (count(*))                    
Relations: Aggregate on (fontime)                    
Remote SQL: SELECT "Year", count(*) FROM "default".ontime GROUP BY "Year"(16 rows)

เชชเซเชฐเชถเซเชจ 14: เช•เชฒเชฎ เชฆเซเชตเชพเชฐเชพ เช“เชฐเซเชกเชฐ เชธเชพเชฅเซ‡ เชชเซเชฐเชถเซเชจ

bm=# EXPLAIN VERBOSE SELECT a."Year", c1/c2 FROM(SELECT "Year", count(*)*1000 AS c1 FROM fontime WHERE "DepDelay" > 10 GROUP BY "Year") a 
     INNER JOIN(SELECT "Year", count(*) as c2 FROM fontime GROUP BY "Year") b  ON a."Year"= b."Year" 
     ORDER BY a."Year";

เชชเซเชฐเชถเซเชจ 14: เช•เชฒเชฎ เชฆเซเชตเชพเชฐเชพ เช“เชฐเซเชกเชฐ เชธเชพเชฅเซ‡ เช•เซเชตเซ‡เชฐเซ€ เชชเซเชฒเชพเชจ

QUERY PLAN 
Merge Join  (cost=2.00..628498.02 rows=50000000 width=12)   
Output: fontime."Year", (((count(*) * 1000)) / (count(*)))   
Inner Unique: true   Merge Cond: (fontime."Year" = fontime_1."Year")   
->  GroupAggregate  (cost=1.00..499.01 rows=1 width=12)        
Output: fontime."Year", (count(*) * 1000)         
Group Key: fontime."Year"         
->  Foreign Scan on public.fontime  (cost=1.00..-1.00 rows=100000 width=4)               
Remote SQL: SELECT "Year" FROM "default".ontime WHERE (("DepDelay" > 10)) 
            ORDER BY "Year" ASC   
->  GroupAggregate  (cost=1.00..499.01 rows=1 width=12)         
Output: fontime_1."Year", count(*)         Group Key: fontime_1."Year"         
->  Foreign Scan on public.fontime fontime_1  (cost=1.00..-1.00 rows=100000 width=4) 
              
Remote SQL: SELECT "Year" FROM "default".ontime ORDER BY "Year" ASC(16 rows)

เชจเชฟเชทเซเช•เชฐเซเชท

เช† เชชเซเชฐเชฏเซ‹เช—เซ‹เชจเชพ เชชเชฐเชฟเชฃเชพเชฎเซ‹ เชฆเชฐเซเชถเชพเชตเซ‡ เช›เซ‡ เช•เซ‡ เช•เซเชฒเชฟเช•เชนเชพเช‰เชธ เช–เชฐเซ‡เช–เชฐ เชธเชพเชฐเซเช‚ เชชเซเชฐเชฆเชฐเซเชถเชจ เช†เชชเซ‡ เช›เซ‡, เช…เชจเซ‡ clickhousedb_fdw เชชเซ‹เชธเซเชŸเช—เซเชฐเซ‡เชเชธเช•เซเชฏเซเชเชฒเชฎเชพเช‚เชฅเซ€ เช•เซเชฒเชฟเช•เชนเชพเช‰เชธเชจเชพ เชชเซเชฐเชฆเชฐเซเชถเชจ เชฒเชพเชญเซ‹ เชชเซเชฐเชฆเชพเชจ เช•เชฐเซ‡ เช›เซ‡. เชœเซเชฏเชพเชฐเซ‡ clickhousedb_fdw เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชคเซ€ เชตเช–เชคเซ‡ เช•เซ‡เชŸเชฒเชพเช• เช“เชตเชฐเชนเซ‡เชก เชนเซ‹เชฏ เช›เซ‡, เชคเซเชฏเชพเชฐเซ‡ เชคเซ‡ เช•เซเชฒเชฟเช•เชนเชพเช‰เชธ เชกเซ‡เชŸเชพเชฌเซ‡เช เชชเชฐ เชจเซ‡เชŸเซ€เชตเชฒเซ€ เชšเชฒเชพเชตเซ€เชจเซ‡ เชชเซเชฐเชพเชชเซเชค เช•เชฐเซ‡เชฒเชพ เชชเซเชฐเชฆเชฐเซเชถเชจ เชธเชพเชฅเซ‡ เชจเช—เชฃเซเชฏ เช…เชจเซ‡ เชคเซเชฒเชจเชพเชคเซเชฎเช• เช›เซ‡. เช† เชชเชฃ เชชเซเชทเซเชŸเชฟ เช•เชฐเซ‡ เช›เซ‡ เช•เซ‡ PostgreSQL เชฎเชพเช‚ fdw เช‰เชคเซเชคเชฎ เชชเชฐเชฟเชฃเชพเชฎเซ‹ เชชเซเชฐเชฆเชพเชจ เช•เชฐเซ‡ เช›เซ‡.

เช•เซเชฒเชฟเช•เชนเชพเช‰เชธ เชฆเซเชตเชพเชฐเชพ เชŸเซ‡เชฒเชฟเช—เซเชฐเชพเชฎ เชšเซ‡เชŸ https://t.me/clickhouse_ru
PostgreSQL เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชŸเซ‡เชฒเชฟเช—เซเชฐเชพเชฎ เชšเซ‡เชŸ https://t.me/pgsql

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹