PostgreSQL, ClickHouse, clickhousedb_fdw (PostgreSQL) เดŽเดจเตเดจเดฟเดตเดฏเดฟเดฒเต† เด…เดจเดฒเดฟเดฑเตเดฑเดฟเด•เตเด•เตฝ เด…เดจเตเดตเต‡เดทเดฃเด™เตเด™เดณเตเดŸเต† เดชเตเดฐเด•เดŸเดจเด‚ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเดจเตเดจเต

เดˆ เดชเด เดจเดคเตเดคเดฟเตฝ, PostgreSQL-เดจเต เดชเด•เดฐเด‚ เด’เดฐเต ClickHouse เดกเดพเดฑเตเดฑเดพ เด‰เดฑเดตเดฟเดŸเด‚ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดฒเต‚เดŸเต† เดŽเดจเดฟเด•เตเด•เต เดŽเดจเตเดคเต เดชเตเดฐเด•เดŸเดจ เดฎเต†เดšเตเดšเดชเตเดชเต†เดŸเตเดคเตเดคเดฒเตเด•เตพ เด•เตˆเดตเดฐเดฟเด•เตเด•เดพเดจเดพเด•เตเดฎเต†เดจเตเดจเต เด•เดพเดฃเดพเตป เดžเดพเตป เด†เด—เตเดฐเดนเดฟเดšเตเดšเต. ClickHouse-เตฝ เดจเดฟเดจเตเดจเต เดŽเดจเดฟเด•เตเด•เต เดฒเดญเดฟเด•เตเด•เตเดจเตเดจ เดชเตเดฐเด•เดŸเดจ เดจเต‡เดŸเตเดŸเด™เตเด™เตพ เดŽเดจเดฟเด•เตเด•เดฑเดฟเดฏเดพเด‚. เด’เดฐเต เดฌเดพเดนเตเดฏ เดกเดพเดฑเตเดฑ เดฑเดพเดชเตเดชเตผ (FDW) เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต PostgreSQL-เตฝ เดจเดฟเดจเตเดจเต ClickHouse เด†เด•เตโ€Œเดธเดธเต เดšเต†เดฏเตโ€Œเดคเดพเตฝ เดˆ เด†เดจเตเด•เต‚เดฒเตเดฏเด™เตเด™เตพ เดธเด‚เดฐเด•เตเดทเดฟเด•เตเด•เดชเตเดชเต†เดŸเตเดฎเต‹?

เดชเด เดจเดคเตเดคเดฟเตป เด•เต€เดดเดฟเดฒเตเดณเตเดณ เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เดชเดฐเดฟเดคเดธเตเดฅเดฟเดคเดฟเด•เตพ PostgreSQL v11, clickhousedb_fdw, ClickHouse เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เดŽเดจเตเดจเดฟเดตเดฏเดพเดฃเต. เด…เดตเดธเดพเดจเดฎเดพเดฏเดฟ, clickhousedb_fdw เดตเดดเดฟ เดฑเต‚เดŸเตเดŸเต เดšเต†เดฏเตโ€Œเดค PostgreSQL v11-เตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เดตเดฟเดตเดฟเดง SQL เด•เตเดตเดฑเดฟเด•เตพ ClickHouse เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเดฟเดฒเต‡เด•เตเด•เต เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเด‚. เดคเตเดŸเตผเดจเตเดจเต, เดจเต‡เดฑเตเดฑเต€เดตเต PostgreSQL-เดฒเตเด‚ เดจเต‡เดฑเตเดฑเต€เดตเต ClickHouse-เดฒเตเด‚ เดŽเด•เตเดธเดฟเด•เตเดฏเต‚เดŸเตเดŸเต เดšเต†เดฏเตเดฏเตเดจเตเดจ เด…เดคเต‡ เด•เตเดตเดฑเดฟเด•เดณเตเดฎเดพเดฏเดฟ FDW-เดฏเตเดŸเต† เดชเตเดฐเด•เดŸเดจเด‚ เดŽเด™เตเด™เดจเต† เดคเดพเดฐเดคเดฎเตเดฏเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเตเดตเต†เดจเตเดจเต เดจเดฎเตเด•เตเด•เต เดจเต‹เด•เตเด•เดพเด‚.

เด•เตเดฒเดฟเด•เตเด•เตเดนเต—เดธเต เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต

เดชเดฐเดฎเตเดชเดฐเดพเด—เดค เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เดธเดฎเต€เดชเดจเด™เตเด™เดณเต‡เด•เตเด•เดพเตพ 100-1000 เดฎเดŸเด™เตเด™เต เดตเต‡เด—เดคเตเดคเดฟเตฝ เดชเตเดฐเด•เดŸเดจเด‚ เด•เตˆเดตเดฐเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเดจเตเดจ เด’เดฐเต เด“เดชเตเดชเตบ เดธเต‹เดดเตโ€Œเดธเต, เด•เต‹เดณเด‚ เด…เดงเดฟเดทเตเด เดฟเดค เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เดฎเดพเดจเต‡เดœเตโ€Œเดฎเต†เดจเตเดฑเต เดธเดฟเดธเตเดฑเตเดฑเดฎเดพเดฃเต เด•เตเดฒเดฟเด•เตเด•เตเดนเต—เดธเต. เด’เดฐเต เดธเต†เด•เตเด•เตปเดกเดฟเดจเตเดณเตเดณเดฟเตฝ เด’เดฐเต เดฌเดฟเดฒเตเดฏเดฃเดฟเดฒเดงเดฟเด•เด‚ เดตเดฐเดฟเด•เตพ เดชเตเดฐเต‹เดธเดธเตเดธเต เดšเต†เดฏเตเดฏเดพเตป เด‡เดคเต เดชเตเดฐเดพเดชเตเดคเดฎเดพเดฃเต.

เด•เตเดฒเดฟเด•เตเด•เตเดนเต—เดธเตเดกเตเดฌเต_เดŽเดซเตเดกเดฟเดกเดฌเตเดฒเตเดฏเต

clickhousedb_fdw โ€” เด•เตเดฒเดฟเด•เตเด•เตเดนเต—เดธเต เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เดŽเด•เตเดธเตเดฑเตเดฑเต‡เดฃเตฝ เดกเดพเดฑเตเดฑ เดฑเดพเดชเตเดชเตผ เด…เดฅเดตเดพ เดŽเดซเตเดกเดฟเดกเดฌเตเดฒเตเดฏเต, เดชเต†เตผเด•เต‹เดฃเดฏเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เด’เดฐเต เด“เดชเตเดชเตบ เดธเต‹เดดเตโ€Œเดธเต เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเดพเดฃเต. เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเดฟเดจเตเดฑเต† GitHub เดถเต‡เด–เดฐเดฃเดคเตเดคเดฟเดฒเต‡เด•เตเด•เตเดณเตเดณ เด’เดฐเต เดฒเดฟเด™เตเด•เต เด‡เดคเดพ..

เดฎเดพเตผเดšเตเดšเดฟเตฝ เดžเดพเตป เดžเด™เตเด™เดณเตเดŸเต† เดŽเดซเตโ€Œเดกเดฟโ€Œเดกเดฌเตเดฒเตเดฏเตเดตเดฟเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต เด•เต‚เดŸเตเดคเตฝ เดชเดฑเดฏเตเดจเตเดจ เด’เดฐเต เดฌเตเดฒเต‹เด—เต เดŽเดดเตเดคเดฟ..

เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด•เดพเดฃเดพเดจเดพเด•เตเดจเตเดจเดคเตเดชเต‹เดฒเต†, เด‡เดคเต เด•เตเดฒเดฟเด•เตเด•เตเดนเต—เดธเดฟเดจเตเดณเตเดณ เด’เดฐเต เดŽเดซเตโ€Œเดกเดฟเดกเดฌเตเดฒเตเดฏเต เดจเตฝเด•เตเดจเตเดจเต, เด…เดคเต เด’เดฐเต เดชเต‹เดธเตเดฑเตเดฑเตโ€Œเด—เตเดฐเต†เดธเตโ€Œเด•เตเดฏเตเดŽเตฝ เดตเดฟ11 เดธเต†เตผเดตเดฑเดฟเตฝ เดจเดฟเดจเตเดจเต เด’เดฐเต เด•เตเดฒเดฟเด•เตเด•เตเดนเต—เดธเต เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเดฟเตฝ เดจเดฟเดจเตเดจเต เดคเดฟเดฐเดžเตเดžเต†เดŸเตเด•เตเด•เดพเดจเตเด‚ เด‡เตปเดธเต‡เตผเดŸเตเดŸเต เดšเต†เดฏเตเดฏเดพเดจเตเด‚ เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต.

เด…เด—เตเดฐเด—เต‡เดฑเตเดฑเตเด•เตพ, เดœเต‹เดฏเดฟเดจเตเด•เตพ เดคเตเดŸเด™เตเด™เดฟเดฏ เดจเต‚เดคเดจ เดธเดตเดฟเดถเต‡เดทเดคเด•เดณเต† FDW เดชเดฟเดจเตเดคเตเดฃเดฏเตเด•เตเด•เตเดจเตเดจเต. เดฑเดฟเดธเต‹เดดเตโ€Œเดธเต-เด‡เดจเตเดฑเตปเดธเต€เดตเต เดชเตเดฐเดตเตผเดคเตเดคเดจเด™เตเด™เตพเด•เตเด•เดพเดฏเดฟ เดฑเดฟเดฎเต‹เดŸเตเดŸเต เดธเต†เตผเดตเตผ เด‰เดฑเดตเดฟเดŸเด™เตเด™เตพ เด‰เดชเดฏเต‹เด—เดชเตเดชเต†เดŸเตเดคเตเดคเตเดจเตเดจเดคเดฟเดฒเต‚เดŸเต† เด‡เดคเต เดชเตเดฐเด•เดŸเดจเด‚ เด—เดฃเตเดฏเดฎเดพเดฏเดฟ เดฎเต†เดšเตเดšเดชเตเดชเต†เดŸเตเดคเตเดคเตเดจเตเดจเต.

เดฌเต†เดžเตเดšเตเดฎเดพเตผเด•เตเด•เต เดชเดฐเดฟเดธเตเดฅเดฟเดคเดฟ

  • เดธเต‚เดชเตเดชเตผเดฎเตˆเด•เตเดฐเต‹ เดธเต†เตผเดตเตผ:
    • Intelยฎ Xeonยฎ CPU E5-2683 v3 @ 2.00GHz
    • 2 เดธเต‹เด•เตเด•เดฑเตเดฑเตเด•เตพ / 28 เด•เต‹เดฑเตเด•เตพ / 56 เดคเตเดฐเต†เดกเตเด•เตพ
    • เดฎเต†เดฎเตเดฎเดฑเดฟ: 256 เดœเดฟเดฌเดฟ เดฑเดพเด‚
    • เดธเด‚เดญเดฐเดฃเด‚: เดธเดพเด‚เดธเด™เต SM863 1.9TB เดŽเดจเตเดฑเตผเดชเตเดฐเตˆเดธเต SSD
    • เดซเดฏเตฝเดธเดฟเดธเตเดฑเตเดฑเด‚: ext4/xfs
  • OS: เดฒเดฟเดจเด•เตเดธเต smblade01 4.15.0-42-generic #45~16.04.1-เด‰เดฌเตเดฃเตเดŸเต
  • เดชเต‹เดธเตเดฑเตเดฑเตเด—เตเดฐเต†เดธเตเด•เตเดฏเตเดŽเตฝ: เดชเดคเดฟเดชเตเดชเต 11

เดฌเต†เดžเตเดšเตเดฎเดพเตผเด•เตเด•เต เดชเดฐเดฟเดถเต‹เดงเดจเด•เตพ

เดˆ เดชเดฐเต€เด•เตเดทเดฃเดคเตเดคเดฟเดจเดพเดฏเดฟ เดฎเต†เดทเต€เตป เดœเดจเดฑเต‡เดฑเตเดฑเดกเต เดกเดพเดฑเตเดฑเดพเดธเต†เดฑเตเดฑเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดชเด•เดฐเด‚, 1987 เดฎเตเดคเตฝ 2018 เดตเดฐเต†เดฏเตเดณเตเดณ "เด“เดชเตเดชเดฑเต‡เดฑเตเดฑเตผ เดธเดฎเดฏเด‚ เดฑเดฟเดชเตเดชเต‹เตผเดŸเตเดŸเต เดšเต†เดฏเตเดค เดธเดฎเดฏเดคเตเดคเดฟเดจเดจเตเดธเดฐเดฟเดšเตเดšเต เด‰เตฝเดชเตเดชเดพเดฆเดจเด•เตเดทเดฎเดค" เดกเดพเดฑเตเดฑ เดžเด™เตเด™เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต. เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดกเดพเดฑเตเดฑ เด†เด•เตโ€Œเดธเดธเต เดšเต†เดฏเตเดฏเดพเตป เด•เดดเดฟเดฏเตเด‚. เดžเด™เตเด™เดณเตเดŸเต† เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต, เด‡เดตเดฟเดŸเต† เดฒเดญเตเดฏเดฎเดพเดฃเต.

เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เดตเดฒเตเดชเตเดชเด‚ 85GB เด†เดฃเต, 109 เดจเดฟเดฐเด•เดณเตเดณเตเดณ เด’เดฐเต เดชเดŸเตเดŸเดฟเด• เดจเตฝเด•เตเดจเตเดจเต.

เดฌเต†เดžเตเดšเตเดฎเดพเตผเด•เตเด•เต เดšเต‹เดฆเตเดฏเด™เตเด™เตพ

ClickHouse, clickhousedb_fdw, PostgreSQL เดŽเดจเตเดจเดฟเดต เดคเดพเดฐเดคเดฎเตเดฏเด‚ เดšเต†เดฏเตเดฏเดพเตป เดžเดพเตป เด‰เดชเดฏเต‹เด—เดฟเดšเตเดš เดšเต‹เดฆเตเดฏเด™เตเด™เตพ เด‡เดคเดพ.

Q#
เดšเต‹เดฆเตเดฏเดคเตเดคเดฟเตฝ เด…เด—เตเดฐเด—เต‡เดฑเตเดฑเตเด•เดณเตเด‚ เด—เตเดฐเต‚เดชเตเดชเต เดฌเตˆเดฏเตเด‚ เด…เดŸเด™เตเด™เดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต

Q1
เด†เดดเตเดšเดฏเดฟเดฒเต† เดฆเดฟเดตเดธเด‚ เดคเดฟเดฐเดžเตเดžเต†เดŸเตเด•เตเด•เตเด•, เดธเดฎเดฏเด‚ เด…เดจเตเดธเดฐเดฟเดšเตเดšเต c เด†เดฏเดฟ เดŽเดฃเตเดฃเตเด• WHERE เดตเตผเดทเด‚ >= 2000 เด‰เด‚ เดตเตผเดทเด‚ <= 2008 เด—เตเดฐเต‚เดชเตเดชเต DayOfWeek เดชเตเดฐเด•เดพเดฐเด‚ c DESC เดชเตเดฐเด•เดพเดฐเด‚ เด“เตผเดกเตผ เดšเต†เดฏเตเดฏเตเด•;

Q2
เด†เดดเตเดšเดฏเดฟเดฒเต† เดฆเดฟเดตเดธเด‚ เดคเดฟเดฐเดžเตเดžเต†เดŸเตเด•เตเด•เตเด•, เดธเดฎเดฏเดคเตเดคเดฟเตฝ เดจเดฟเดจเตเดจเต c เด†เดฏเดฟ เดŽเดฃเตเดฃเตเด• WHERE DepDelay>10 AND Year>= 2000 AND Year> <= 2008 GROUP เดฌเตˆ DayOfWeek> c DESC เดชเตเดฐเด•เดพเดฐเด‚ เด“เตผเดกเตผ เดšเต†เดฏเตเดฏเตเด•;

Q3
เด‰เดคเตเดญเดตเด‚ เดคเดฟเดฐเดžเตเดžเต†เดŸเตเด•เตเด•เตเด•, เดธเดฎเดฏเด‚ เด…เดจเตเดธเดฐเดฟเดšเตเดšเต c as c WHERE DepDelay>10 AND Year>= 2000 AND Year <= 2008 เด‰เดคเตเดญเดตเด‚ เด…เดจเตเดธเดฐเดฟเดšเตเดšเต เด—เตเดฐเต‚เดชเตเดชเต c DESC เดชเดฐเดฟเดงเดฟ 10 เดชเตเดฐเด•เดพเดฐเด‚ เด“เตผเดกเตผ เดšเต†เดฏเตเดฏเตเด•;

Q4
เด•เดพเดฐเดฟเดฏเตผ เดคเดฟเดฐเดžเตเดžเต†เดŸเตเด•เตเด•เตเด•, เดŽเดฃเตเดฃเตเด•() เด•เตƒเดคเตเดฏเดธเดฎเดฏเดคเตเดคเต เดจเดฟเดจเตเดจเต WHERE DepDelay 10 AND Year = 2007 เด—เตเดฐเต‚เดชเตเดชเต เด•เดพเดฐเดฟเดฏเตผ เด“เตผเดกเตผ เดชเตเดฐเด•เดพเดฐเด‚ เดŽเดฃเตเดฃเด‚() เดกเดฟเด‡เดŽเดธเตเดธเดฟ;

Q5
เดŽ.เด•เดพเดฐเดฟเดฏเตผ, เดธเดฟ, เดธเดฟ2, เดธเดฟ เดคเดฟเดฐเดžเตเดžเต†เดŸเตเด•เตเด•เตเด•1000/c2 เด†เดฏเดฟ c3 FROM ( เด•เดพเดฐเดฟเดฏเตผ เดคเดฟเดฐเดžเตเดžเต†เดŸเตเด•เตเด•เตเด•, เดŽเดฃเตเดฃเตเด•() AS c FROM ontime WHERE DepDelay 10 AND Year=2007 GROUP BY Carrier ) a INNER JOIN ( SELECT Carrier, count(*) AS c2 FROM ontime WHERE Year=2007 GROUP BY Carrier)b on a.Carrier=b.Carrier ORDER BY c3 DESC;

Q6
เดŽ.เด•เดพเดฐเดฟเดฏเตผ, เดธเดฟ, เดธเดฟ2, เดธเดฟ เดคเดฟเดฐเดžเตเดžเต†เดŸเตเด•เตเด•เตเด•1000/c2 เด†เดฏเดฟ c3 FROM ( เด•เดพเดฐเดฟเดฏเตผ เดคเดฟเดฐเดžเตเดžเต†เดŸเตเด•เตเด•เตเด•, เดŽเดฃเตเดฃเตเด•() AS c FROM ontime WHERE DepDelay 10 AND Year >= 2000 AND Year <= 2008 GROUP BY เด•เดพเดฐเดฟเดฏเตผ) a INNER JOIN ( SELECT CARIER, count(*) AS c2 FROM ontime WHERE Year >= 2000 AND Year <= 2008 GROUP BY เด•เดพเดฐเดฟเดฏเตผ ) b on a.Carrier=b.Carrier C3 DESC เดตเดดเดฟ เด“เตผเดกเตผ เดšเต†เดฏเตเดฏเตเด•;

Q7
เด•เดพเดฐเดฟเดฏเตผ เดคเดฟเดฐเดžเตเดžเต†เดŸเตเด•เตเด•เตเด•, เดถเดฐเดพเดถเดฐเดฟ(DepDelay) * 1000 AS c3 เด“เตบเดŸเตˆเดฎเดฟเตฝ เดจเดฟเดจเตเดจเต WHERE เดตเตผเดทเด‚ >= 2000 เด‰เด‚ เดตเตผเดทเด‚ <= 2008 เด—เตเดฐเต‚เดชเตเดชเต เด•เดพเดฐเดฟเดฏเตผ เดชเตเดฐเด•เดพเดฐเด‚;

Q8
เดตเตผเดทเด‚ เดคเดฟเดฐเดžเตเดžเต†เดŸเตเด•เตเด•เตเด•, เดถเดฐเดพเดถเดฐเดฟ (DepDelay) เด•เตƒเดคเตเดฏเดธเดฎเดฏเดคเตเดคเต เดจเดฟเดจเตเดจเต เด—เตเดฐเต‚เดชเตเดชเต เด…เดจเตเดธเดฐเดฟเดšเตเดšเต เดตเตผเดทเด‚;

Q9
เดตเตผเดทเด‚ เดคเดฟเดฐเดžเตเดžเต†เดŸเตเด•เตเด•เตเด•, เด“เตบเดŸเตˆเด‚ เด—เตเดฐเต‚เดชเตเดชเดฟเตฝ เดจเดฟเดจเตเดจเต เดตเตผเดทเด‚ เด…เดจเตเดธเดฐเดฟเดšเตเดšเต c1 เด†เดฏเดฟ เดŽเดฃเตเดฃเตเด•(*);

Q10
เดถเดฐเดพเดถเดฐเดฟ(cnt) เดคเดฟเดฐเดžเตเดžเต†เดŸเตเด•เตเด•เตเด• (เดตเตผเดทเด‚,เดฎเดพเดธเด‚,เดŽเดฃเตเดฃเด‚(*) as cnt FROM Ontime WHERE DepDel15=1 GROUP BY Year,Month) a;

Q11
(เดตเตผเดทเด‚,เดฎเดพเดธเด‚,เดŽเดฃเตเดฃเด‚(*) เดŽเดจเตเดจเดฟเดต c1 เด†เดฏเดฟ เดคเดฟเดฐเดžเตเดžเต†เดŸเตเด•เตเด•เตเด•) a เดŽเดจเตเดจเดคเดฟเตฝ เดจเดฟเดจเตเดจเต เดถเดฐเดพเดถเดฐเดฟ(c1) เดคเดฟเดฐเดžเตเดžเต†เดŸเตเด•เตเด•เตเด•;

Q12
OriginCityName, DestCityName เดŽเดจเตเดจเดฟเดต เดคเดฟเดฐเดžเตเดžเต†เดŸเตเด•เตเด•เตเด•, count(*) AS c FROM ontime GROUP BY OriginCityName, DestCityName C DESC LIMIT 10 เดชเตเดฐเด•เดพเดฐเด‚ เด“เตผเดกเตผ เดšเต†เดฏเตเดฏเตเด•;

Q13
OriginCityName เดคเดฟเดฐเดžเตเดžเต†เดŸเตเด•เตเด•เตเด•, count(*) as c FROM ontime GROUP BY OriginCityName C DESC LIMIT 10 เด“เตผเดกเตผ เดšเต†เดฏเตเดฏเตเด•;

เดšเต‹เดฆเตเดฏเดคเตเดคเดฟเตฝ เดœเต‹เดฏเดฟเดจเตเด•เตพ เด…เดŸเด™เตเด™เดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต

Q14
เดตเตผเดทเด‚ เดคเดฟเดฐเดžเตเดžเต†เดŸเตเด•เตเด•เตเด•, c1/c2 FROM ( เดตเตผเดทเด‚ เดคเดฟเดฐเดžเตเดžเต†เดŸเตเด•เตเด•เตเด•, เดŽเดฃเตเดฃเด‚ ()1000 as c1 from ontime WHERE DepDelay 10 GROUP BY Year) a INNER JOIN (Year เดคเดฟเดฐเดžเตเดžเต†เดŸเตเด•เตเด•เตเด•, count(*) from c2 from ontime GROUP BY Year ) b on a.Year=b.Year ORDER BY a.Year;

Q15
เด’เดฐเต โ€œเดตเตผเดทเด‚โ€, c1/c2 FROM เดคเดฟเดฐเดžเตเดžเต†เดŸเตเด•เตเด•เตเด• ( โ€œเดตเตผเดทเด‚โ€ เดคเดฟเดฐเดžเตเดžเต†เดŸเตเด•เตเด•เตเด•, เดŽเดฃเตเดฃเตเด•()1000 as c1 from fontime WHERE โ€œDepDelayโ€>10 GROUP BY โ€œYearโ€) a INNER JOIN (โ€œYearโ€ เดคเดฟเดฐเดžเตเดžเต†เดŸเตเด•เตเด•เตเด•, count(*) as c2 as fontime GROUP BY โ€œYearโ€ ) b on a.โ€Yearโ€=b.โ€Yearโ€;

เดชเดŸเตเดŸเดฟเด•-1: เดฌเต†เดžเตเดšเตเดฎเดพเตผเด•เตเด•เดฟเตฝ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจ เดšเต‹เดฆเตเดฏเด™เตเด™เตพ

เด…เดจเตเดตเต‡เดทเดฃ เดจเดฟเตผเดตเตเดตเดนเดฃเด™เตเด™เตพ

เดตเตเดฏเดคเตเดฏเดธเตเดค เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเต เด•เตเดฐเดฎเต€เด•เดฐเดฃเด™เตเด™เดณเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ เด“เดฐเต‹ เด…เดจเตเดตเต‡เดทเดฃเดคเตเดคเดฟเดจเตเดฎเตเดณเตเดณ เดซเดฒเด™เตเด™เตพ เด‡เดคเดพ: เดธเต‚เดšเดฟเด•เด•เดณเตเดณเตเดณเดคเตเด‚ เด‡เดฒเตเดฒเดพเดคเตเดคเดคเตเดฎเดพเดฏ PostgreSQL, เดจเต‡เดฑเตเดฑเต€เดตเต ClickHouse, clickhousedb_fdw. เดธเดฎเดฏเด‚ เดฎเดฟเดฒเตเดฒเดฟเดธเต†เด•เตเด•เตปเดกเตเด•เดณเดฟเตฝ เด•เดพเดฃเดฟเด•เตเด•เตเดจเตเดจเต.

Q#
PostgreSQL เดŽเดจเตเดจเต€
เดชเต‹เดธเตเดฑเตเดฑเตเด—เตเดฐเต†เดŽเดธเตเด•เตเดฏเตเดŽเตฝ (เด‡เตปเดกเต†เด•เตเดธเต เดšเต†เดฏเตเดคเดคเต)
เด•เตเดฒเดฟเด•เตเด•เตเดน ouse เดธเต
เด•เตเดฒเดฟเด•เตเด•เตเดนเต—เดธเตเดกเตเดฌเต_เดŽเดซเตเดกเดฟเดกเดฌเตเดฒเตเดฏเต

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 เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต Postgres-เตฝ เดจเดฟเดจเตเดจเต เดตเต€เดฃเตเดŸเต†เดŸเตเด•เตเด•เตเดจเตเดจ ClickHouse เดซเดฒเด™เตเด™เดณเตเด‚ เดกเดพเดฑเตเดฑเดฏเตเด‚ เด•เดพเดฃเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต. PostgreSQL-เดจเตเด‚ ClickHouse-เดจเตเด‚ เด‡เดŸเดฏเดฟเตฝ เด’เดฐเต เดชเตเดฐเดงเดพเดจ เดตเตเดฏเดคเตเดฏเดพเดธเด‚ เดชเดŸเตเดŸเดฟเด• เด•เดพเดฃเดฟเด•เตเด•เตเดจเตเดจเต, เดŽเดจเตเดจเดพเตฝ ClickHouse-เดจเตเด‚ clickhousedb_fdw-เดจเตเด‚ เด‡เดŸเดฏเดฟเดฒเตเดณเตเดณ เดเดฑเตเดฑเดตเตเด‚ เด•เตเดฑเดžเตเดž เดตเตเดฏเดคเตเดฏเดพเดธเด‚.

PostgreSQL, ClickHouse, clickhousedb_fdw (PostgreSQL) เดŽเดจเตเดจเดฟเดตเดฏเดฟเดฒเต† เด…เดจเดฒเดฟเดฑเตเดฑเดฟเด•เตเด•เตฝ เด…เดจเตเดตเต‡เดทเดฃเด™เตเด™เดณเตเดŸเต† เดชเตเดฐเด•เดŸเดจเด‚ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเดจเตเดจเต

ClickhouseDB เดฏเตเด‚ clickhousedb_fdw เดฏเตเด‚ เดคเดฎเตเดฎเดฟเดฒเตเดณเตเดณ เดตเตเดฏเดคเตเดฏเดพเดธเด‚ เดˆ เด—เตเดฐเดพเดซเต เด•เดพเดฃเดฟเด•เตเด•เตเดจเตเดจเต. เดฎเดฟเด•เตเด• เด…เดจเตเดตเต‡เดทเดฃเด™เตเด™เตพเด•เตเด•เตเด‚, FDW เดฏเตเดŸเต† เด“เดตเตผเดนเต†เดกเต เด…เดคเตเดฐ เด‰เดฏเตผเดจเตเดจเดคเดฒเตเดฒ, Q12 เด’เดดเดฟเด•เต†, เด‡เดคเต เดตเดณเดฐเต† เดชเตเดฐเดพเดงเดพเดจเตเดฏเดฎเตผเดนเดฟเด•เตเด•เตเดจเตเดจเดคเตเดฎเดพเดฃเต. เดˆ เดšเต‹เดฆเตเดฏเดคเตเดคเดฟเตฝ เดœเต‹เดฏเดฟเดจเตเด•เดณเตเด‚ เด’เดฐเต ORDER BY เด•เตเดฒเต‹เดธเตเด‚ เด‰เตพเดชเตเดชเต†เดŸเตเดจเตเดจเต. ORDER BY เด•เตเดฒเต‹เดธเต เด•เดพเดฐเดฃเด‚, GROUP/BY, ORDER BY เดŽเดจเตเดจเดฟเดต ClickHouse เดฒเต‡เด•เตเด•เต เดคเดณเตเดณเดฟเดตเดฟเดŸเตเดจเตเดจเดฟเดฒเตเดฒ.

เดชเดŸเตเดŸเดฟเด• 2-เตฝ, Q12, Q13 เดŽเดจเตเดจเต€ เดšเต‹เดฆเตเดฏเด™เตเด™เดณเดฟเตฝ เดธเดฎเดฏเดคเตเดคเดฟเตฝ เด’เดฐเต เด•เตเดคเดฟเดšเตเดšเตเดšเดพเดŸเตเดŸเด‚ เด•เดพเดฃเดพเด‚. เดตเต€เดฃเตเดŸเตเด‚, เด‡เดคเต ORDER BY เด•เตเดฒเต‹เดธเต เดฎเต‚เดฒเดฎเดพเดฃเต เดธเด‚เดญเดตเดฟเด•เตเด•เตเดจเตเดจเดคเต. เด‡เดคเต เดธเตเดฅเดฟเดฐเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต, เดžเดพเตป Q-14, Q-15 เดšเต‹เดฆเตเดฏเด™เตเด™เตพ ORDER BY เด•เตเดฒเต‹เดธเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเตเด‚ เด…เดฒเตเดฒเดพเดคเต†เดฏเตเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเดšเตเดšเต. ORDER BY เด•เตเดฒเต‹เดธเต เด‡เดฒเตเดฒเดพเดคเต†, เดชเต‚เตผเดคเตเดคเต€เด•เดฐเดฃ เดธเดฎเดฏเด‚ 259 ms เด†เดฃเต, เด…เดคเต‡เดธเดฎเดฏเด‚ ORDER BY เด•เตเดฒเต‹เดธเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต, เด‡เดคเต 1364212 ms เด†เดฃเต. เดˆ เดšเต‹เดฆเตเดฏเด‚ เดกเต€เดฌเด—เต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต, เดžเดพเตป เดฐเดฃเตเดŸเต เดšเต‹เดฆเตเดฏเด™เตเด™เดณเตเด‚ เดตเดฟเดถเดฆเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเต, เดซเดฒเด™เตเด™เตพ เด‡เดตเดฟเดŸเต† เด•เดพเดฃเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต.

เดšเต‹เดฆเตเดฏเด‚ 15: เด“เตผเดกเตผ เดฌเตˆ เด•เตเดฒเต‹เดธเต เด‡เดฒเตเดฒเดพเดคเต†

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)

เดคเต€เดฐเตเดฎเดพเดจเด‚

เดˆ เดชเดฐเต€เด•เตเดทเดฃเด™เตเด™เดณเตเดŸเต† เดซเดฒเด™เตเด™เตพ เด•เดพเดฃเดฟเด•เตเด•เตเดจเตเดจเดคเต ClickHouse เดฎเดฟเด•เดšเตเดš เดชเตเดฐเด•เดŸเดจเด‚ เดตเดพเด—เตเดฆเดพเดจเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต เดŽเดจเตเดจเดพเดฃเต, เด•เต‚เดŸเดพเดคเต† clickhousedb_fdw ClickHouse เดจเตเดฑเต† เดชเตเดฐเด•เดŸเดจ เดจเต‡เดŸเตเดŸเด™เตเด™เตพ PostgreSQL-เดฒเต‡เด•เตเด•เต เด•เตŠเดฃเตเดŸเตเดตเดฐเตเดจเตเดจเต. clickhousedb_fdw เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ เดšเดฟเดฒ เด“เดตเตผเดนเต†เดกเตเด•เตพ เด‰เดฃเตเดŸเต†เด™เตเด•เดฟเดฒเตเด‚, เด…เดคเต เดจเดฟเดธเตเดธเดพเดฐเดตเตเด‚ เด’เดฐเต ClickHouse เดกเดพเดฑเตเดฑเดพเดฌเต‡เดธเดฟเตฝ เดจเต‡เดฑเตเดฑเต€เดตเต เด†เดฏเดฟ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ เดจเต‡เดŸเตเดจเตเดจ เดชเตเดฐเด•เดŸเดจเดตเตเดฎเดพเดฏเดฟ เดคเดพเดฐเดคเดฎเตเดฏเดชเตเดชเต†เดŸเตเดคเตเดคเดพเดตเตเดจเตเดจเดคเตเดฎเดพเดฃเต. PostgreSQL-เดฒเต† fdw เดฎเดฟเด•เดšเตเดš เดซเดฒเด™เตเด™เตพ เดจเตฝเด•เตเดจเตเดจเตเดตเต†เดจเตเดจเต เด‡เดคเต เดธเตเดฅเดฟเดฐเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเต.

เด•เตเดฒเดฟเด•เตเด•เตเดนเต—เดธเดฟเดฒเต† เดŸเต†เดฒเดฟเด—เตเดฐเดพเด‚ เดšเดพเดฑเตเดฑเต https://t.me/clickhouse_ru
PostgreSQL เดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเตเดณเตเดณ เดŸเต†เดฒเดฟเด—เตเดฐเดพเด‚ เดšเดพเดฑเตเดฑเต https://t.me/pgsql

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