PostgreSQL, ClickHouse рдЖрдгрд┐ clickhousedb_fdw (PostgreSQL) рдордзреАрд▓ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рддреНрдордХ рдкреНрд░рд╢реНрдирд╛рдВрдЪреА рдХрд╛рдордЧрд┐рд░реА рддрдкрд╛рд╕рдд рдЖрд╣реЗ

рдпрд╛ рдЕрднреНрдпрд╛рд╕рд╛рдд, рдорд▓рд╛ PostgreSQL рдРрд╡рдЬреА ClickHouse рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рд╡рд╛рдкрд░реВрди рдХрд╛рдп рдХрд╛рдордЧрд┐рд░реА рд╕реБрдзрд╛рд░рдгрд╛ рд╕рд╛рдзреНрдп рдХрд░рддрд╛ рдпреЗрддреАрд▓ рд╣реЗ рдкрд╣рд╛рдпрдЪреЗ рд╣реЛрддреЗ. рдорд▓рд╛ рдХреНрд▓рд┐рдХрд╣рд╛рдКрд╕ рд╡рд╛рдкрд░реВрди рдорд┐рд│рдгрд╛рд░реЗ рдЙрддреНрдкрд╛рджрдХрддрд╛ рдлрд╛рдпрджреЗ рдорд╛рд╣рд┐рдд рдЖрд╣реЗрдд. рдореА рдлреЙрд░реЗрди рдбреЗрдЯрд╛ рд░реЕрдкрд░ (FDW) рд╡рд╛рдкрд░реВрди PostgreSQL рд╡рд░реВрди рдХреНрд▓рд┐рдХрд╣рд╛рдКрд╕рдордзреНрдпреЗ рдкреНрд░рд╡реЗрд╢ рдХреЗрд▓реНрдпрд╛рд╕ рд╣реЗ рдлрд╛рдпрджреЗ рдЪрд╛рд▓реВ рд░рд╛рд╣рддреАрд▓ рдХрд╛?

PostgreSQL v11, clickhousedb_fdw рдЖрдгрд┐ ClickHouse рдбреЗрдЯрд╛рдмреЗрд╕рдЪрд╛ рдЕрднреНрдпрд╛рд╕ рдХреЗрд▓реЗрд▓рд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рд╡рд╛рддрд╛рд╡рд░рдг рдЖрд╣реЗ. рд╢реЗрд╡рдЯреА, PostgreSQL v11 рд╡рд░реВрди рдЖрдореНрд╣реА рдЖрдордЪреНрдпрд╛ clickhousedb_fdw рджреНрд╡рд╛рд░реЗ ClickHouse рдбреЗрдЯрд╛рдмреЗрд╕рдХрдбреЗ рд░рд╛рдЙрдЯ рдХреЗрд▓реЗрд▓реНрдпрд╛ рд╡рд┐рд╡рд┐рдз SQL рдХреНрд╡реЗрд░реА рдЪрд╛рд▓рд╡рдгрд╛рд░ рдЖрд╣реЛрдд. рдордЧ рдЖрдореНрд╣реА FDW рдЪреЗ рдХрд╛рд░реНрдпрдкреНрд░рджрд░реНрд╢рди рдореВрд│ PostgreSQL рдЖрдгрд┐ рдореВрд│ рдХреНрд▓рд┐рдХрд╣рд╛рдКрд╕рдордзреНрдпреЗ рдЪрд╛рд▓реВ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рд╕рдорд╛рди рдХреНрд╡реЗрд░реАрд╢реА рдХрд╕реЗ рддреБрд▓рдирд╛ рдХрд░рддреЗ рддреЗ рдкрд╛рд╣реВ.

рдХреНрд▓рд┐рдХрд╣рд╛рдКрд╕ рдбреЗрдЯрд╛рдмреЗрд╕

ClickHouse рд╣реА рдПрдХ рдореБрдХреНрдд рд╕реНрд░реЛрдд рд╕реНрддрдВрднреАрдп рдбреЗрдЯрд╛рдмреЗрд╕ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди рдкреНрд░рдгрд╛рд▓реА рдЖрд╣реЗ рдЬреА рдкрд╛рд░рдВрдкрд╛рд░рд┐рдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдкрдзреНрджрддреАрдВрдкреЗрдХреНрд╖рд╛ 100-1000 рдкрдЯ рд╡реЗрдЧрд╛рдиреЗ рдХрд╛рд░реНрдпрдкреНрд░рджрд░реНрд╢рди рд╕рд╛рдзреНрдп рдХрд░реВ рд╢рдХрддреЗ, рдПрдХрд╛ рд╕реЗрдХрдВрджрд╛рдкреЗрдХреНрд╖рд╛ рдХрдореА рд╡реЗрд│рд╛рдд рдПрдХ рдЕрдмреНрдЬ рдкрдВрдХреНрддреАрдВрд╡рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рдгреНрдпрд╛рд╕ рд╕рдХреНрд╖рдо рдЖрд╣реЗ.

Clickhousedb_fdw

clickhousedb_fdw - рдХреНрд▓рд┐рдХрд╣рд╛рдКрд╕ рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд┐рдВрд╡рд╛ FDW рд╕рд╛рдареА рдмрд╛рд╣реНрдп рдбреЗрдЯрд╛ рд░реЕрдкрд░, Percona рдордзреАрд▓ рдПрдХ рдореБрдХреНрдд рд╕реНрд░реЛрдд рдкреНрд░рдХрд▓реНрдк рдЖрд╣реЗ. рдпреЗрдереЗ рдкреНрд░рдХрд▓реНрдкрд╛рдЪреНрдпрд╛ 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
  • PostgreSQL: рдЖрд╡реГрддреНрддреА 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
рдореВрд│ рдирд┐рд╡рдбрд╛, рдЧрдгрдирд╛ (*) рдСрдирдЯрд╛рдЗрдо рдкрд╛рд╕реВрди c рдореНрд╣рдгреВрди рдХрд░рд╛ рдЬреЗрдереЗ DepDelay>10 рдЖрдгрд┐ рд╡рд░реНрд╖ >= 2000 рдЖрдгрд┐ рд╡рд░реНрд╖ <= 2008 рдореВрд│ рдХреНрд░рдорд╛рдиреБрд╕рд╛рд░ c DESC рдорд░реНрдпрд╛рджрд╛ 10 рдиреБрд╕рд╛рд░ рдЧрдЯ;

Q4
рд╡рд╛рд╣рдХ рдирд┐рд╡рдбрд╛, рдЧрдгрдирд╛() рдСрдирдЯрд╛рдЗрдо рдХреБрдареЗ рд╡рд┐рд▓рдВрдм> 10 рдЖрдгрд┐ рд╡рд░реНрд╖ = 2007 рдЧрдЯ рд╡рд╛рд╣рдХ рдХреНрд░рдорд╛рдиреБрд╕рд╛рд░ рдЧрдгрдирд╛ () DESC;

Q5
рдирд┐рд╡рдбрд╛ a.рд╡рд╛рд╣рдХ, c, c2, c1000/c2 c3 FROM рдореНрд╣рдгреВрди ( рд╡рд╛рд╣рдХ рдирд┐рд╡рдбрд╛, рдЧрдгрдирд╛ () рдСрдирдЯрд╛рдЗрдо рдкрд╛рд╕реВрди рдЬреЗрдереЗ DepDelay>10 рдЖрдгрд┐ рд╡рд░реНрд╖ = 2007 рд╡рд╛рд╣рдХрд╛рджреНрд╡рд╛рд░реЗ рдЧрдЯ ) рдПрдХ рдЕрдВрддрд░реНрдЧрдд рд╕рд╛рдореАрд▓ рд╡реНрд╣рд╛ ( рд╡рд╛рд╣рдХ рдирд┐рд╡рдбрд╛, рдЧрдгрдирд╛ (*) рдСрдирдЯрд╛рдЗрдордкрд╛рд╕реВрди c2 рдореНрд╣рдгреВрди рдЬреЗрдереЗ рд╡рд░реНрд╖ = рд╡рд╛рд╣рдХрд╛рджреНрд╡рд╛рд░реЗ 2007 рдЧрдЯ) b a.Carrier=b.ORDERCarrier рд╡рд░ C3 DESC рджреНрд╡рд╛рд░реЗ;

Q6
рдирд┐рд╡рдбрд╛ a.рд╡рд╛рд╣рдХ, c, c2, c1000/c2 c3 FROM рдореНрд╣рдгреВрди ( рд╡рд╛рд╣рдХ рдирд┐рд╡рдбрд╛, рдЧрдгрдирд╛ () c рдСрдирдЯрд╛рдЗрдо рдкрд╛рд╕реВрди рдЬреЗрдереЗ Depdelay>10 рдЖрдгрд┐ рд╡рд░реНрд╖ >= 2000 рдЖрдгрд┐ рд╡рд░реНрд╖ <= рд╡рд╛рд╣рдХ рджреНрд╡рд╛рд░реЗ 2008 рдЧрдЯ) рдПрдХ рдЕрдВрддрд░реНрдЧрдд рд╕рд╛рдореАрд▓ рд╡реНрд╣рд╛ ( рд╡рд╛рд╣рдХ рдирд┐рд╡рдбрд╛, рдЧрдгрдирд╛ рдХрд░рд╛ рд╡рд╛рд╣рдХ ) b рд╡рд░ a.Carrier=b.Carrier ORDER by c2 DESC;

Q7
рд╡рд╛рд╣рдХ рдирд┐рд╡рдбрд╛, рд╕рд░рд╛рд╕рд░реА(DepDelay) * 1000 AS c3 рдкрд╛рд╕реВрди рдСрдирдЯрд╛рдЗрдо рдЬреЗрдереЗ рд╡рд░реНрд╖ >= 2000 рдЖрдгрд┐ рд╡рд░реНрд╖ <= рд╡рд╛рд╣рдХрд╛рджреНрд╡рд╛рд░реЗ 2008 рдЧрдЯ;

Q8
рд╡рд░реНрд╖ рдирд┐рд╡рдбрд╛, рд╕рд░рд╛рд╕рд░реА (рдЙрд╢реАрд░ рд╡рд┐рд▓рдВрдм) рдСрдирдЯрд╛рдЗрдо рдЧрдЯрд╛рдиреБрд╕рд╛рд░ рд╡рд░реНрд╖;

Q9
рд╡рд░реНрд╖ рдирд┐рд╡рдбрд╛, рд╡рд░реНрд╖рд╛рдиреБрд╕рд╛рд░ рдСрдирдЯрд╛рдЗрдо рдЧрдЯрд╛рддреВрди c1 рдореНрд╣рдгреВрди рдореЛрдЬрд╛(*);

Q10
рдордзреВрди рд╕рд░рд╛рд╕рд░реА(cnt) рдирд┐рд╡рдбрд╛ (рд╡рд░реНрд╖, рдорд╣рд┐рдирд╛,рдЧрдгрдирд╛ (*) рдСрдирдЯрд╛рдЗрдо рдкрд╛рд╕реВрди cnt рдореНрд╣рдгреВрди рдирд┐рд╡рдбрд╛ рдЬреЗрдереЗ DepDel15=1 рдЧрдЯрд╛рдиреБрд╕рд╛рд░ рд╡рд░реНрд╖, рдорд╣рд┐рдирд╛) a;

Q11
рдордзреВрди рд╕рд░рд╛рд╕рд░реА(c1) рдирд┐рд╡рдбрд╛ (рд╡рд░реНрд╖,рдорд╣рд┐рдирд╛,рдЧрдгрдирд╛(*) рдСрдирдЯрд╛рдЗрдо рдЧрдЯрд╛рддреВрди c1 рдореНрд╣рдгреВрди рд╡рд░реНрд╖,рдорд╣рд┐рдирд╛ рдирд┐рд╡рдбрд╛) a;

Q12
OriginCityName, DestCityName, рдЧрдгрдирд╛(*) рдирд┐рд╡рдбрд╛ рдУрд░рд┐рдЬрд┐рдирд╕рд┐рдЯреАрдиреЗрдо рдиреБрд╕рд╛рд░ рдЧреНрд░реБрдк, C DESC рдорд░реНрдпрд╛рджрд╛ 10 рджреНрд╡рд╛рд░реЗ DestCityName рдСрд░реНрдбрд░ рдХрд░рд╛;

Q13
OriginCityName рд╕рд┐рд▓реЗрдХреНрдЯ рдХрд░рд╛, рдЧрдгрдирд╛(*) рд╡рд░реВрди c рдордзреВрди C DESC LIMIT 10 рджреНрд╡рд╛рд░реЗ OriginCityName рдХреНрд░рдорд╛рдиреЗ рдЧрдЯ рдХрд░рд╛;

рдХреНрд╡реЗрд░реАрдордзреНрдпреЗ рд╕рд╛рдореАрд▓ рдЖрд╣реЗрдд

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 ( тАЬрд╡рд░реНрд╖тАЭ рдирд┐рд╡рдбрд╛, рдЧрдгрдирд╛()1000 рдлреЙрдиреНрдЯрд╛рдИрдо рдкрд╛рд╕реВрди c1 рдореНрд╣рдгреВрди рдЬреЗрдереЗ тАЬDepDelayтАЭ>10 рдЧреНрд░реБрдк рдмрд╛рдп тАЬрд╡рд░реНрд╖тАЭ) рдПрдХ рдЗрдирд░ рдЬреЙрдИрди (тАЬрд╡рд░реНрд╖тАЭ рдирд┐рд╡рдбрд╛, рдореЛрдЬрд╛(*) рдлреЙрдиреНрдЯрд╛рдИрдо рдЧреНрд░реБрдк рдордзреВрди тАЬрд╡рд░реНрд╖тАЭ ) b рд╡рд░ a.тАЭYearтАЭ=b. "рд╡рд░реНрд╖";

рддрдХреНрддрд╛-1: рдмреЗрдВрдЪрдорд╛рд░реНрдХрдордзреНрдпреЗ рд╡рд╛рдкрд░рд▓реЗрд▓реЗ рдкреНрд░рд╢реНрди

рдЪреМрдХрд╢реА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА

рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗрдЯрд┐рдВрдЧреНрдЬрдордзреНрдпреЗ рдЪрд╛рд▓рд╡рд▓реНрдпрд╛ рдЬрд╛рддрд╛рдд рддреЗрд╡реНрд╣рд╛ рдкреНрд░рддреНрдпреЗрдХ рдХреНрд╡реЗрд░реАрдЪреЗ рдкрд░рд┐рдгрд╛рдо рдпреЗрдереЗ рдЖрд╣реЗрдд: рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛рд╕рд╣ рдЖрдгрд┐ рддреНрдпрд╛рд╢рд┐рд╡рд╛рдп PostgreSQL, рдореВрд│ рдХреНрд▓рд┐рдХрд╣рд╛рдКрд╕ рдЖрдгрд┐ 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 ClickHouse рд╡рд░ рдЦрд╛рд▓реА рдпреЗрдд рдирд╛рд╣реА.

рддрдХреНрддрд╛ 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";

Q15: рдХреНрд▓реЙрдЬ рджреНрд╡рд╛рд░реЗ рдСрд░реНрдбрд░ рди рдХрд░рддрд╛ рдХреНрд╡реЗрд░реА

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)

Q14: ORDER BY рдХреНрд▓реЙрдЬрд╕рд╣ рдХреНрд╡реЗрд░реА

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";

Q14: ORDER BY рдХреНрд▓реЙрдЬрд╕рд╣ рдХреНрд╡реЗрд░реА рдпреЛрдЬрдирд╛

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 рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдПрд╕рдХреНрдпреВрдПрд▓ рд╡рд░реВрди рдХреНрд▓рд┐рдХрд╣рд╛рдКрд╕рдЪреЗ рдХрд╛рд░реНрдпрдкреНрд░рджрд░реНрд╢рди рд▓рд╛рдн рджреЗрддреЗ. clickhousedb_fdw рд╡рд╛рдкрд░рддрд╛рдирд╛ рдХрд╛рд╣реА рдУрд╡реНрд╣рд░рд╣реЗрдб рдЕрд╕рд▓реЗ рддрд░реА, рдХреНрд▓рд┐рдХрд╣рд╛рдКрд╕ рдбреЗрдЯрд╛рдмреЗрд╕рд╡рд░ рдиреЗрдЯрд┐рд╡реНрд╣рд▓реА рдЪрд╛рд▓рд╡реВрди рд╕рд╛рдзреНрдп рдХреЗрд▓реЗрд▓реНрдпрд╛ рдХрд╛рдордЧрд┐рд░реАрд╢реА рддреЗ рдирдЧрдгреНрдп рдЖрдгрд┐ рддреБрд▓рдиреЗрдиреЗ рдпреЛрдЧреНрдп рдЖрд╣реЗ. рд╣реЗ рджреЗрдЦреАрд▓ рдкреБрд╖реНрдЯреА рдХрд░рддреЗ рдХреА PostgreSQL рдордзреАрд▓ fdw рдЙрддреНрдХреГрд╖реНрдЯ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рджрд╛рди рдХрд░рддреЗ.

рдХреНрд▓рд┐рдХрд╣рд╛рдКрд╕ рджреНрд╡рд╛рд░реЗ рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдЪреЕрдЯ https://t.me/clickhouse_ru
PostgreSQL рд╡рд╛рдкрд░реВрди рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдЪреЕрдЯ https://t.me/pgsql

рд╕реНрддреНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛