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

рдЗрд╕ рдЕрдзреНрдпрдпрди рдореЗрдВ, рдореИрдВ рдпрд╣ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ PostgreSQL рдХреЗ рдмрдЬрд╛рдп ClickHouse рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреНрдпрд╛ рдкреНрд░рджрд░реНрд╢рди рд╕реБрдзрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ 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 рдХреЗ рд▓рд┐рдП рдмрд╛рд╣рд░реА рдбреЗрдЯрд╛ рд░реИрдкрд░, рдкреЗрд░рдХреЛрдирд╛ рдХрд╛ рдПрдХ рдУрдкрди рд╕реЛрд░реНрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╣реИред рдпрд╣рд╛рдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ GitHub рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХрд╛ рд▓рд┐рдВрдХ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ.

рдорд╛рд░реНрдЪ рдореЗрдВ рдореИрдВрдиреЗ рдПрдХ рдмреНрд▓реЙрдЧ рд▓рд┐рдЦрд╛ рдерд╛ рдЬреЛ рдЖрдкрдХреЛ рд╣рдорд╛рд░реЗ FDW рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХ рдмрддрд╛рддрд╛ рд╣реИ.

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ, рдпрд╣ ClickHouse рдХреЗ рд▓рд┐рдП рдПрдХ FDW рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ PostgreSQL v11 рд╕рд░реНрд╡рд░ рд╕реЗ ClickHouse рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ SELECT from рдФрд░ INSERT INTO рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

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

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

  • рд╕реБрдкрд░рдорд╛рдЗрдХреНрд░реЛ рд╕рд░реНрд╡рд░:
    • Intel┬о Xeon┬о CPU E5-2683 v3 @ 2.00GHz
    • 2 рд╕реЙрдХреЗрдЯ / 28 рдХреЛрд░ / 56 рдзрд╛рдЧреЗ
    • рдореЗрдореЛрд░реА: 256GB RAM
    • рднрдВрдбрд╛рд░рдг: рд╕реИрдорд╕рдВрдЧ SM863 1.9TB рдПрдВрдЯрд░рдкреНрд░рд╛рдЗрдЬ SSD
    • рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо: ext4/xfs
  • рдУрдПрд╕: рд▓рд┐рдирдХреНрд╕ sblade01 4.15.0-42-рдЬреЗрдиреЗрд░рд┐рдХ #45~16.04.1-рдЙрдмрдВрдЯреВ
  • рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдПрд╕рдХреНрдпреВрдПрд▓: рд╕рдВрд╕реНрдХрд░рдг 11

рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдкрд░реАрдХреНрд╖рдг

рдЗрд╕ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдорд╢реАрди-рдЬрдирд┐рдд рдбреЗрдЯрд╛ рд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдордиреЗ 1987 рд╕реЗ 2018 рддрдХ "рд╕рдордп рд░рд┐рдкреЛрд░реНрдЯ рдСрдкрд░реЗрдЯрд░ рд╕рдордп рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрд╛рджрдХрддрд╛" рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рдЖрдк рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╣рд╛рдВ рдЙрдкрд▓рдмреНрдз рд╣рдорд╛рд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛.

рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рдЖрдХрд╛рд░ 85 рдЬреАрдмреА рд╣реИ, рдЬреЛ 109 рдХреЙрд▓рдо рдХреА рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдкреНрд░рд╢реНрди

рдпрд╣рд╛рдВ рд╡реЗ рдкреНрд░рд╢реНрди рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рдореИрдВрдиреЗ ClickHouse, clickhousedb_fdw рдФрд░ PostgreSQL рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдерд╛ред

Q#
рдХреНрд╡реЗрд░реА рдореЗрдВ рд╕рдореБрдЪреНрдЪрдп рдФрд░ рд╕рдореВрд╣ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ

Q1
рд╕рдкреНрддрд╛рд╣ рдХреЗ рджрд┐рди рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ, рдСрдирдЯрд╛рдЗрдо рд╕реЗ (*) рдХреЛ рд╕реА рдХреЗ рд░реВрдк рдореЗрдВ рдЧрд┐рдиреЗрдВ рдЬрд╣рд╛рдВ рд╡рд░реНрд╖ >= 2000 рдФрд░ рд╡рд░реНрд╖ <= 2008 рд╕рдкреНрддрд╛рд╣ рдХреЗ рджрд┐рди рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рдореВрд╣, рд╕реА рдбреАрдИрдПрд╕рд╕реА рджреНрд╡рд╛рд░рд╛ рдЖрджреЗрд╢;

Q2
рдбреЗрдСрдлрд╝рд╡реАрдХ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ, рдСрдирдЯрд╛рдЗрдо рд╕реЗ рдЧрд┐рдиреЗрдВ (*) рд╕реА рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╣рд╛рдВ рдбреЗрдкрдбрд┐рд▓реЗ>10 рдФрд░ рд╡рд░реНрд╖ >= 2000 рдФрд░ рд╡рд░реНрд╖ <= 2008 рдЧреНрд░реБрдк рдмрд╛рдп рдбреЗрдСрдлрд╝рд╡реАрдХ рдСрд░реНрдбрд░ рдмрд╛рдп рд╕реА рдбреАрдИрдПрд╕рд╕реА;

Q3
рдЙрддреНрдкрддреНрддрд┐ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ, рдЧрд┐рдиреЗрдВ (*) AS c рдСрдирдЯрд╛рдЗрдо рд╕реЗ рдЬрд╣рд╛рдВ DepDelay>10 рдФрд░ рд╡рд░реНрд╖ >= 2000 рдФрд░ рд╡рд░реНрд╖ <= 2008 рдЙрддреНрдкрддреНрддрд┐ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рдореВрд╣, C DESC LIMIT 10 рджреНрд╡рд╛рд░рд╛ рд╕рдореВрд╣;

Q4
рд╡рд╛рд╣рдХ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ, рдЧрд┐рдирддреА рдХрд░реЗрдВ() рд╕рдордп рд╕реЗ рдЬрд╣рд╛рдВ DepDelay>10 рдФрд░ рд╡рд░реНрд╖ = 2007 рдЧреНрд░реБрдк рдмрд╛рдп рдХреИрд░рд┐рдпрд░ рдСрд░реНрдбрд░ рдмрд╛рдп рдХрд╛рдЙрдВрдЯ() рдбреАрдИрдПрд╕рд╕реА;

Q5
рдП.рдХреИрд░рд┐рдпрд░, рд╕реА, рд╕реА2, рд╕реА рдЪреБрдиреЗрдВ1000/c2 рдХреЛ c3 рдХреЗ рд░реВрдк рдореЗрдВ FROM (рд╡рд╛рд╣рдХ рдЪреБрдиреЗрдВ, рдЧрд┐рдирддреА рдХрд░реЗрдВ() AS c рд╕рдордп рд╕реЗ рдЬрд╣рд╛рдВ DepDelay>10 рдФрд░ рд╡рд░реНрд╖ = 2007 рд╡рд╛рд╣рдХ рджреНрд╡рд╛рд░рд╛ рд╕рдореВрд╣) рдПрдХ рдЖрдВрддрд░рд┐рдХ рдЬреЛрдбрд╝ (рд╡рд╛рд╣рдХ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ, рдЧрд┐рдирддреА (*) AS c2 рд╕реЗ ontime рд╕реЗ рдЬрд╣рд╛рдВ рд╡рд░реНрд╖ = 2007 рд╡рд╛рд╣рдХ рджреНрд╡рд╛рд░рд╛ рд╕рдореВрд╣)b рдкрд░ a.Carrier=b.рд╡рд╛рд╣рдХ рдЖрджреЗрд╢ рд╕реА3 рдбреАрдИрдПрд╕рд╕реА рджреНрд╡рд╛рд░рд╛;

Q6
рдП.рдХреИрд░рд┐рдпрд░, рд╕реА, рд╕реА2, рд╕реА рдЪреБрдиреЗрдВ1000/c2 рдХреЛ c3 рдХреЗ рд░реВрдк рдореЗрдВ FROM (рд╡рд╛рд╣рдХ рдЪреБрдиреЗрдВ, рдЧрд┐рдирддреА рдХрд░реЗрдВ() рдПрдПрд╕ рд╕реА рдлреНрд░реЙрдо рдСрдирдЯрд╛рдЗрдо рдЬрд╣рд╛рдВ рдбреЗрдкрдбрд┐рд▓реЗ>10 рдФрд░ рд╡рд░реНрд╖ >= 2000 рдФрд░ рд╡рд░реНрд╖ <= 2008 рдЧреНрд░реБрдк рдмрд╛рдп рдХреИрд░рд┐рдпрд░) рдПрдХ рдЗрдирд░ рдЬреЙрдЗрди (рд╕реЗрд▓реЗрдХреНрдЯ рдХреИрд░рд┐рдпрд░, рдЧрд┐рдирддреА(*) рдПрдПрд╕ рд╕реА2 рдлреНрд░реЙрдо рдСрдирдЯрд╛рдЗрдо рдЬрд╣рд╛рдВ рдИрдпрд░ >= 2000 рдФрд░ рд╡рд░реНрд╖ <= 2008 рдЧреНрд░реБрдк рдмрд╛рдп рдХреИрд░рд┐рдпрд░ ) рдмреА рдСрди рдП.рдХреИрд░рд┐рдпрд░=рдмреА.рдХреИрд░рд┐рдпрд░ рдСрд░реНрдбрд░ рдмрд╛рдп рд╕реА3 рдбреАрдИрдПрд╕рд╕реА;

Q7
рдХреИрд░рд┐рдпрд░ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ, рдФрд╕рдд (рдбрд┐рдкреЗрд▓реЗ) * 1000 рдПрдПрд╕ рд╕реА3 рдСрдирдЯрд╛рдЗрдо рд╕реЗ рдЬрд╣рд╛рдВ рд╡рд░реНрд╖ >= 2000 рдФрд░ рд╡рд░реНрд╖ <= 2008 рдХреИрд░рд┐рдпрд░ рджреНрд╡рд╛рд░рд╛ рд╕рдореВрд╣;

Q8
рд╡рд░реНрд╖ рджрд░ рд╡рд░реНрд╖ рд╕рдореВрд╣ рдореЗрдВ рд╕реЗ рд╡рд░реНрд╖, рдФрд╕рдд (рдбрд┐рдкрдбрд┐рд▓реЗ) рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ;

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

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

Q11
(рд╡рд░реНрд╖, рдорд╛рд╣, рдЧрд┐рдирддреА (*) рдХреЛ рд╡рд░реНрд╖, рдорд╛рд╣ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдСрдирдЯрд╛рдЗрдо рд╕рдореВрд╣ рд╕реЗ рд╕реА1 рдХреЗ рд░реВрдк рдореЗрдВ рдЪреБрдиреЗрдВ) рд╕реЗ рдФрд╕рдд (рд╕реА1) рдЪреБрдиреЗрдВ;

Q12
рдУрд░рд┐рдЬрд┐рдирд╕рд┐рдЯреАрдирд╛рдо, рдбреЗрд╕реНрдЯрд╕рд┐рдЯреАрдирд╛рдо, рдХрд╛рдЙрдВрдЯ(*) рдХреЛ рдСрдирдЯрд╛рдЗрдо рдЧреНрд░реБрдк рд╕реЗ рдУрд░рд┐рдЬрд┐рдирд╕рд┐рдЯреАрдирд╛рдо, рдбреЗрд╕реНрдЯрд╕рд┐рдЯреАрдирд╛рдо рдСрд░реНрдбрд░ рджреНрд╡рд╛рд░рд╛ рд╕реА рдбреАрдИрдПрд╕рд╕реА рд▓рд┐рдорд┐рдЯ 10 рд╕реЗ рдЪреБрдиреЗрдВ;

Q13
рдУрд░рд┐рдЬрд┐рди рд╕рд┐рдЯреА рдирд╛рдо рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ, рдУрд░рд┐рдЬрд┐рди рд╕рд┐рдЯреА рдирд╛рдо рдСрд░реНрдбрд░ рджреНрд╡рд╛рд░рд╛ рд╕реА рдбреАрдИрдПрд╕рд╕реА рд╕реАрдорд╛ 10 рджреНрд╡рд╛рд░рд╛ рдСрдирдЯрд╛рдЗрдо рдЧреНрд░реБрдк рд╕реЗ рд╕реА рдХреЗ рд░реВрдк рдореЗрдВ рдЧрд┐рдирддреА (*) рдХрд░реЗрдВ;

рдХреНрд╡реЗрд░реА рдореЗрдВ рдЬреЛрдбрд╝ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ

Q14
a.Year, c1/c2 FROM рдЪреБрдиреЗрдВ (рд╡рд░реНрд╖ рдЪреБрдиреЗрдВ, рдЧрд┐рдирддреА рдХрд░реЗрдВ()1000 рдСрдирдЯрд╛рдЗрдо рд╕реЗ рд╕реА1 рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╣рд╛рдВ рдбреЗрдкрдбрд┐рд▓реЗ>10 рдЧреНрд░реБрдк рдмрд╛рдп рдИрдпрд░) рдПрдХ рдЗрдирд░ рдЬреЙрдЗрди (рд╡рд░реНрд╖ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ, рдСрдирдЯрд╛рдЗрдо рдЧреНрд░реБрдк рдмрд╛рдп рдИрдпрд░ рд╕реЗ рд╕реА2 рдХреЗ рд░реВрдк рдореЗрдВ рдЧрд┐рдирддреА (*)) рдмреА рдкрд░ рдП.рдИрдпрд░=рдмреА.рдИрдпрд░ рдСрд░реНрдбрд░ рдмрд╛рдп рдП.рдИрдпрд░;

Q15
a.'рд╡рд░реНрд╖', c1/c2 FROM рдЪреБрдиреЗрдВ ('рд╡рд░реНрд╖' рдЪреБрдиреЗрдВ'', рдЧрд┐рдирддреА рдХрд░реЗрдВ()рдлреЙрдиреНрдЯрдЯрд╛рдЗрдо рд╕реЗ рд╕реА1000 рдХреЗ рд░реВрдк рдореЗрдВ 1 рдЬрд╣рд╛рдВ "рдбреЗрдкрдбрд┐рд▓реЗ">10 рдЧреНрд░реБрдк рдмрд╛рдп "рдИрдпрд░") рдПрдХ рдЗрдирд░ рдЬреЙрдЗрди ("рдИрдпрд░" тАЛтАЛрдЪреБрдиреЗрдВ, рдлреЙрдиреНрдЯрдЯрд╛рдЗрдо рдЧреНрд░реБрдк рд╕реЗ рд╕реА2 рдХреЗ рд░реВрдк рдореЗрдВ (*) рдХреЛ "рдИрдпрд░" тАЛтАЛрдХреЗ рд╣рд┐рд╕рд╛рдм рд╕реЗ рдЧрд┐рдиреЗрдВ) рдмреА рдСрди рдПред"рдИрдпрд░"=рдмреАред "рд╡рд░реНрд╖";

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

рдХреНрд╡реЗрд░реА рдирд┐рд╖реНрдкрд╛рджрди

рд╡рд┐рднрд┐рдиреНрди рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рдЪрд▓рд╛рдиреЗ рдкрд░ рдкреНрд░рддреНрдпреЗрдХ рдХреНрд╡реЗрд░реА рдХреЗ рдкрд░рд┐рдгрд╛рдо рдпрд╣рд╛рдВ рджрд┐рдП рдЧрдП рд╣реИрдВ: рдЗрдВрдбреЗрдХреНрд╕ рдХреЗ рд╕рд╛рде рдФрд░ рдмрд┐рдирд╛ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдПрд╕рдХреНрдпреВрдПрд▓, рдореВрд▓ ClickHouse рдФрд░ clickhousedb_fdwред рд╕рдордп рдорд┐рд▓реАрд╕реЗрдХреЗрдВрдб рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ.

Q#
рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдПрд╕рдХреНрдпреВрдПрд▓
рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдПрд╕рдХреНрдпреВрдПрд▓ (рдЕрдиреБрдХреНрд░рдорд┐рдд)
рдХреНрд▓рд┐рдХрд╣рд╛рдЙрд╕
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 рдЕрдХреНрд╖ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдХреЛ рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдореЗрдВ рджрд┐рдЦрд╛рддрд╛ рд╣реИред ClickHouse рдкрд░рд┐рдгрд╛рдо рдФрд░ 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 рдХреНрд╡реЗрд░реАрдЬрд╝ рдЪрд▓рд╛рдИрдВред рдСрд░реНрдбрд░ рдмрд╛рдп рдХреНрд▓реЙрдЬ рдХреЗ рдмрд┐рдирд╛ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХрд╛ рд╕рдордп 259 рдПрдордПрд╕ рд╣реИ рдФрд░ рдСрд░реНрдбрд░ рдмрд╛рдп рдХреНрд▓реЙрдЬ рдХреЗ рд╕рд╛рде рдпрд╣ 1364212 рд╣реИред рдЗрд╕ рдХреНрд╡реЗрд░реА рдХреЛ рдбреАрдмрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВ рджреЛрдиреЛрдВ рдкреНрд░рд╢реНрдиреЛрдВ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдпрд╣рд╛рдВ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рдкрд░рд┐рдгрд╛рдо рд╣реИрдВред

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

рдХреНрд▓рд┐рдХрд╣рд╛рдЙрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдЪреИрдЯ https://t.me/clickhouse_ru
PostgreSQL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдЪреИрдЯ https://t.me/pgsql

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ