PostgreSQL, ClickHouse рд░ clickhousedb_fdw (PostgreSQL) рдорд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рддреНрдордХ рдкреНрд░рд╢реНрдирд╣рд░реВрдХреЛ рдкреНрд░рджрд░реНрд╢рди рдкрд░реАрдХреНрд╖рдг рдЧрд░реНрджреИ

рдпрд╕ рдЕрдзреНрдпрдпрдирдорд╛, рдо PostgreSQL рдХреЛ рд╕рдЯреНрдЯрд╛ ClickHouse рдбрд╛рдЯрд╛ рд╕реНрд░реЛрдд рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рд╕реБрдзрд╛рд░рд╣рд░реВ рд╣рд╛рд╕рд┐рд▓ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ рднрдиреЗрд░ рд╣реЗрд░реНрди рдЪрд╛рд╣рдиреНрдереЗрдВред рдорд▓рд╛рдИ рдХреНрд▓рд┐рдХрд╣рд╛рдЙрд╕ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдкреНрд░рд╛рдкреНрдд рд╣реБрдиреЗ рдЙрддреНрдкрд╛рджрдХрддреНрд╡ рд▓рд╛рднрд╣рд░реВ рдерд╛рд╣рд╛ рдЫред рдпрджрд┐ рдореИрд▓реЗ рд╡рд┐рджреЗрд╢реА рдбрд╛рдЯрд╛ рд░реНрдпрд╛рдкрд░ (FDW) рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ PostgreSQL рдмрд╛рдЯ ClickHouse рдкрд╣реБрдБрдЪ рдЧрд░реЗрдорд╛ рдпреА рд▓рд╛рднрд╣рд░реВ рдЬрд╛рд░реА рд░рд╣рдиреНрдЫ?

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

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

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

Clickhousedb_fdw

clickhousedb_fdw - ClickHouse рдбрд╛рдЯрд╛рдмреЗрд╕, рд╡рд╛ FDW рдХреЛ рд▓рд╛рдЧрд┐ рдмрд╛рд╣реНрдп рдбрд╛рдЯрд╛ рд░реНрдпрд╛рдкрд░, Percona рдХреЛ рдПрдХ рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реЛред рдпрд╣рд╛рдБ рдкрд░рд┐рдпреЛрдЬрдирд╛рдХреЛ GitHub рднрдгреНрдбрд╛рд░рдХреЛ рд▓рд┐рдЩреНрдХ рдЫ.

рдорд╛рд░реНрдЪрдорд╛ рдореИрд▓реЗ рдПрдЙрдЯрд╛ рдмреНрд▓рдЧ рд▓реЗрдЦреЗрдВ рдЬрд╕рд▓реЗ рддрдкрд╛рдИрдВрд▓рд╛рдИ рд╣рд╛рдореНрд░реЛ FDW рдмрд╛рд░реЗ рдердк рдмрддрд╛рдЙрдБрдЫ.

рддрдкрд╛рдИрд▓реЗ рджреЗрдЦреНрдиреБрд╣реБрдиреЗрдЫ, рдпрд╕рд▓реЗ ClickHouse рдХреЛ рд▓рд╛рдЧрд┐ FDW рдкреНрд░рджрд╛рди рдЧрд░реНрджрдЫ рдЬрд╕рд▓реЗ PostgreSQL v11 рд╕рд░реНрднрд░рдмрд╛рдЯ ClickHouse рдбрд╛рдЯрд╛рдмреЗрд╕ рдмрд╛рдЯ SELECT, рд░ INSERT INTO рд▓рд╛рдИ рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫред

FDW рд▓реЗ рдЙрдиреНрдирдд рд╕реБрд╡рд┐рдзрд╛рд╣рд░реВрд▓рд╛рдИ рд╕рдорд░реНрдерди рдЧрд░реНрджрдЫ рдЬрд╕реНрддреИ рд╕рдордЧреНрд░ рд░ рд╕рд╛рдореЗрд▓ред рдпрд╕рд▓реЗ рдпреА рд╕реНрд░реЛрдд-рдЧрд╣рди рдЕрдкрд░реЗрд╢рдирд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рд░рд┐рдореЛрдЯ рд╕рд░реНрднрд░рдХреЛ рд╕реНрд░реЛрддрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдХрд╛рд░реНрдпрд╕рдореНрдкрд╛рджрдирдорд╛ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд╕реБрдзрд╛рд░ рдЧрд░реНрджрдЫред

рдмреЗрдиреНрдЪрдорд╛рд░реНрдХ рд╡рд╛рддрд╛рд╡рд░рдг

  • рд╕реБрдкрд░рдорд╛рдЗрдХреНрд░реЛ рд╕рд░реНрднрд░:
    • Intel┬о Xeon┬о CPU E5-2683 v3 @ 2.00GHz
    • 2 рд╕рдХреЗрдЯрд╣рд░реВ / 28 рдХреЛрд░ / 56 рдереНрд░реЗрдбрд╣рд░реВ
    • рдореЗрдореЛрд░реА: GB рдЬреАрдмреАрдХреЛ рд░реНрдпрд╛рдо
    • рднрдгреНрдбрд╛рд░рдг: 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
DayOfWeek рдЪрдпрди рдЧрд░реНрдиреБрд╣реЛрд╕реН, рдЧрдгрдирд╛ (*) рдмрд╛рдЯ c рдмрд╛рдЯ ontime рдЬрд╣рд╛рдБ рд╡рд░реНрд╖ >= 2000 рд░ рд╡рд░реНрд╖ <= 2008 GROUP BY DayOfWeek ORDER BY c DESC;

Q2
DayOfWeek рдЪрдпрди рдЧрд░реНрдиреБрд╣реЛрд╕реН, рдЧрдиреНрдиреБрд╣реЛрд╕реН

Q3
рдЙрддреНрдкрддреНрддрд┐ рдЪрдпрди рдЧрд░реНрдиреБрд╣реЛрд╕реН, рдЧрдгрдирд╛ (*) рдХреЛ рд░реВрдкрдорд╛ c FROM ontime WHERE DepDelay>10 рд░ рд╡рд░реНрд╖ >= 2000 рд░ рд╡рд░реНрд╖ <= 2008 GROUP Origin ORDER BY c DESC LIMIT 10;

Q4
рдХреНрдпрд╛рд░рд┐рдпрд░ рдЪрдпрди рдЧрд░реНрдиреБрд╣реЛрд╕реН, рдЧрдгрдирд╛ () рдмрд╛рдЯ рдУрдирдЯрд╛рдЗрдо рдХрд╣рд╛рдБ DepDelay> 10 рд░ рд╡рд░реНрд╖ = 2007 рд╕рдореВрд╣ рджреНрд╡рд╛рд░рд╛ рд╡рд╛рд╣рдХ рдХреНрд░рдо рдЧрдгрдирд╛ рджреНрд╡рд╛рд░рд╛ () DESC;

Q5
рдЪрдпрди рдЧрд░реНрдиреБрд╣реЛрд╕реН a. рдХреНрдпрд╛рд░рд┐рдпрд░, c, c2, c1000/c2 рдмрд╛рдЯ c3 рдХреЛ рд░реВрдкрдорд╛ ( рдЪрдпрди рдЧрд░реНрдиреБрд╣реЛрд╕реН рдХреНрдпрд╛рд░рд┐рдпрд░, рдЧрдгрдирд╛ () AS c FROM ontime HERE DepDelay>10 рд░ рд╡рд░реНрд╖ = рд╡рд╛рд╣рдХ рджреНрд╡рд╛рд░рд╛ рд╕рдореВрд╣ ) рдПрдХ рднрд┐рддреНрд░реА рд╕рд╛рдореЗрд▓ рд╣реБрдиреБрд╣реЛрд╕реН ( рдЪрдпрди рдЧрд░реНрдиреБрд╣реЛрд╕реН рдХреНрдпрд╛рд░рд┐рдпрд░, рдЧрдгрдирд╛ (*) рдХреЛ рд░реВрдкрдорд╛ c2007 рдмрд╛рдЯ рдУрдирдЯрд╛рдЗрдо рдЬрд╣рд╛рдБ рд╡рд░реНрд╖ = 2 рд╡рд╛рд╣рдХ рджреНрд╡рд╛рд░рд╛ рд╕рдореВрд╣) b рдорд╛ a.Carrier=b.ORDERCarrier C2007 DESC рджреНрд╡рд╛рд░рд╛;

Q6
рдЪрдпрди рдЧрд░реНрдиреБрд╣реЛрд╕реН a. рдХреНрдпрд╛рд░рд┐рдпрд░, c, c2, c1000/c2 рдмрд╛рдЯ c3 рдХреЛ рд░реВрдкрдорд╛ ( рдЪрдпрди рдЧрд░реНрдиреБрд╣реЛрд╕реН рдХреНрдпрд╛рд░рд┐рдпрд░, рдЧрдгрдирд╛ () c FROM ontime рдХрд╣рд╛рдБ DepDelay> 10 рд░ рд╡рд░реНрд╖ >= 2000 рд░ рд╡рд░реНрд╖ <= 2008 GROUP BY рд╡рд╛рд╣рдХ) рдПрдХ рднрд┐рддреНрд░реА рд╕рд╛рдореЗрд▓ рд╣реБрдиреБрд╣реЛрд╕реН ( рд╡рд╛рд╣рдХ рдЪрдпрди рдЧрд░реНрдиреБрд╣реЛрд╕реН, рдЧрдгрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН (*) c2 рдмрд╛рдЯ ontime рдЬрд╣рд╛рдБ рд╡рд░реНрд╖ >= 2000 рд░ рд╡рд░реНрд╖ <= BY 2008 рдХреНрдпрд╛рд░рд┐рдпрд░ ) b on a.Carrier=b.Carrier ORDER BY c3 DESC;

Q7
рдХреНрдпрд╛рд░рд┐рдпрд░ рдЪрдпрди рдЧрд░реНрдиреБрд╣реЛрд╕реН, рдФрд╕рдд (DepDelay) * 1000 AS c3 FROM ontime WHERE Year >= 2000 рд░ рд╡рд░реНрд╖ <= 2008 GROUP BY рд╡рд╛рд╣рдХ;

Q8
рд╡рд░реНрд╖ рдЪрдпрди рдЧрд░реНрдиреБрд╣реЛрд╕реН, рдФрд╕рдд (DepDelay) FROM ontime GROUP BY рд╡рд░реНрд╖;

Q9
рд╡рд░реНрд╖ рдЪрдпрди рдЧрд░реНрдиреБрд╣реЛрд╕реН, рд╡рд░реНрд╖ рдЕрдиреБрд╕рд╛рд░ рдЕрдирдЯрд╛рдЗрдо рд╕рдореВрд╣рдмрд╛рдЯ c1 рдХреЛ рд░реВрдкрдорд╛ рдЧрдгрдирд╛ (*);

Q10
рдмрд╛рдЯ рдФрд╕рдд (рд╕реАрдПрдирдЯреА) рдЪрдпрди рдЧрд░реНрдиреБрд╣реЛрд╕реН (рд╡рд░реНрд╖, рдорд╣рд┐рдирд╛, рдЧрдгрдирд╛ (*) рд╕реАрдиреНрдЯрдХреЛ рд░реВрдкрдорд╛ рдПрдХ рд╕рдордпрдмрд╛рдЯ рдЪрдпрди рдЧрд░реНрдиреБрд╣реЛрд╕реН рдЬрд╣рд╛рдБ DepDel15=1 рд╡рд░реНрд╖, рдорд╣рд┐рдирд╛ рдЕрдиреБрд╕рд╛рд░ рд╕рдореВрд╣) a;

Q11
рдмрд╛рдЯ рдФрд╕рдд (c1) рдЪрдпрди рдЧрд░реНрдиреБрд╣реЛрд╕реН (рд╡рд░реНрд╖, рдорд╣рд┐рдирд╛, рдЧрдгрдирд╛ (*) c1 рдХреЛ рд░реВрдкрдорд╛ рд╡рд░реНрд╖, рдорд╣рд┐рдирд╛ рджреНрд╡рд╛рд░рд╛ рдЕрдирдЯрд╛рдЗрдо рд╕рдореВрд╣рдмрд╛рдЯ рдЪрдпрди рдЧрд░реНрдиреБрд╣реЛрд╕реН) a;

Q12
рдЪрдпрди рдЧрд░реНрдиреБрд╣реЛрд╕реН OriginCityName, DestCityName, рдЧрдгрдирд╛(*) рдХреЛ рд░реВрдкрдорд╛ c FROM FROM GROUP OriginCityName рджреНрд╡рд╛рд░рд╛, DestCityName ORDER by c DESC LIMIT 10;

Q13
OriginCityName рдЪрдпрди рдЧрд░реНрдиреБрд╣реЛрд╕реН, C DESC LIMIT 10 рджреНрд╡рд╛рд░рд╛ OriginCityName ORDER BY OriginCityName рдмрд╛рдЯ OriginCityName рдмрд╛рдЯ c рдмрд╛рдЯ рдЧрдгрдирд╛(*);

рдХреНрд╡реЗрд░реАрдорд╛ рдЬреЛрдбрд┐рдПрдХреЛ рдЫ

Q14
рдЪрдпрди рдЧрд░реНрдиреБрд╣реЛрд╕реН a.Year, c1/c2 FROM ( рд╡рд░реНрд╖ рдЪрдпрди рдЧрд░реНрдиреБрд╣реЛрд╕реН, рдЧрдгрдирд╛ ()1000 c1 рдХреЛ рд░реВрдкрдорд╛ ontime рдмрд╛рдЯ WHERE DepDelay>10 GROUP BY) рднрд┐рддреНрд░реА рд╕рд╛рдореЗрд▓ рд╣реБрдиреБрд╣реЛрд╕реН (рд╡рд░реНрд╖ рдЪрдпрди рдЧрд░реНрдиреБрд╣реЛрд╕реН, рдЧрдгрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН (*) c2 рдХреЛ рд░реВрдкрдорд╛ ontime GROUP BY Year ) b on a.Year=b.Year ORDER BY a.Year;

Q15
рдЪрдпрди рдЧрд░реНрдиреБрд╣реЛрд╕реН a."рд╡рд░реНрд╖", c1/c2 рдмрд╛рдЯ ("рд╡рд░реНрд╖" рдЪрдпрди рдЧрд░реНрдиреБрд╣реЛрд╕реН, рдЧрдгрдирд╛ ()1000 c1 рдХреЛ рд░реВрдкрдорд╛ рдлрдиреНрдЯрдЯрд╛рдЗрдо рдмрд╛рдЯ рдЬрд╣рд╛рдБ "DepDelay"> "рд╡рд░реНрд╖" рджреНрд╡рд╛рд░рд╛ 10 рд╕рдореВрд╣) рдПрдХ рднрд┐рддреНрд░реА рдЬреЛрдЗрди ("рд╡рд░реНрд╖" рдЪрдпрди рдЧрд░реНрдиреБрд╣реЛрд╕реН, рдЧрдгрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН (*) рдлрдиреНрдЯрдЯрд╛рдЗрдо рд╕рдореВрд╣рдмрд╛рдЯ "рд╡рд░реНрд╖" рдмрд╛рдЯ c2 рдХреЛ рд░реВрдкрдорд╛ ) b рдорд╛ a.тАЭYearтАЭ=bред "рд╡рд░реНрд╖";

рддрд╛рд▓рд┐рдХрд╛-рез: рдмреЗрдиреНрдЪрдорд╛рд░реНрдХрдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдПрдХрд╛ рдкреНрд░рд╢реНрдирд╣рд░реВ

рдХреНрд╡реЗрд░реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди

рд╡рд┐рднрд┐рдиреНрди рдбрд╛рдЯрд╛рдмреЗрд╕ рд╕реЗрдЯрд┐рдЩрд╣рд░реВрдорд╛ рдЪрд▓рд╛рдЙрдБрджрд╛ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рд╢реНрдирдХрд╛ рдирддрд┐рдЬрд╛рд╣рд░реВ рдпрд╣рд╛рдБ рдЫрдиреН: PostgreSQL рд╕рдБрдЧ рд░ рдмрд┐рдирд╛ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛, рдиреЗрдЯрд┐рдн ClickHouse рд░ clickhousedb_fdwред рд╕рдордп рдорд┐рд▓рд┐рд╕реЗрдХреЗрдиреНрдбрдорд╛ рджреЗрдЦрд╛рдЗрдПрдХреЛ рдЫред

Q#
PostgreSQL
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

рддрд╛рд▓рд┐рдХрд╛-рез: рдмреЗрдиреНрдЪрдорд╛рд░реНрдХрдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдПрдХрд╛ рдкреНрд░рд╢реНрдирд╣рд░реВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрди рд▓рд╛рдЧреНрдиреЗ рд╕рдордп

рдирддрд┐рдЬрд╛рд╣рд░реВ рд╣реЗрд░реНрдиреБрд╣реЛрд╕реН

рдЧреНрд░рд╛рдлрд▓реЗ рдХреНрд╡реЗрд░реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рдордп рдорд┐рд▓рд┐рд╕реЗрдХреЗрдиреНрдбрдорд╛ рджреЗрдЦрд╛рдЙрдБрдЫ, X рдЕрдХреНрд╖рд▓реЗ рдорд╛рдерд┐рдХреЛ рддрд╛рд▓рд┐рдХрд╛рдмрд╛рдЯ рдХреНрд╡реЗрд░реА рдирдореНрдмрд░ рджреЗрдЦрд╛рдЙрдБрдЫ, рд░ Y рдЕрдХреНрд╖рд▓реЗ рдорд┐рд▓рд┐рд╕реЗрдХреЗрдиреНрдбрдорд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рдордп рджреЗрдЦрд╛рдЙрдБрдЫред Clickhousedb_fdw рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрд╕рдмрд╛рдЯ рдкреНрд░рд╛рдкреНрдд рдЧрд░рд┐рдПрдХрд╛ рдХреНрд▓рд┐рдХрд╣рд╛рдЙрд╕ рдкрд░рд┐рдгрд╛рдорд╣рд░реВ рд░ рдбрд╛рдЯрд╛ рджреЗрдЦрд╛рдЗрдПрдХрд╛ рдЫрдиреНред рддрд╛рд▓рд┐рдХрд╛рдмрд╛рдЯ рддрдкрд╛рдИрд▓реЗ рджреЗрдЦреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рдХрд┐ 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 рдЦрдгреНрдбрдХреЛ рдХрд╛рд░рдгрд▓реЗ рднрдПрдХреЛ рд╣реЛред рдпреЛ рдкреБрд╖реНрдЯрд┐ рдЧрд░реНрди, рдореИрд▓реЗ 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 рдХреЛ рд╕рд╛рде рдХреНрд╡реЗрд░реА

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

Clickhouse рдорд╛рд░реНрдлрдд рдЯреЗрд▓рд┐рдЧреНрд░рд╛рдо рдЪреНрдпрд╛рдЯ https://t.me/clickhouse_ru
PostgreSQL рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдЯреЗрд▓рд┐рдЧреНрд░рд╛рдо рдЪреНрдпрд╛рдЯ https://t.me/pgsql

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди