PostgreSQL, ClickHouse ๋ฐ clickhousedb_fdw(PostgreSQL)์—์„œ ๋ถ„์„ ์ฟผ๋ฆฌ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ

๋ณธ ์—ฐ๊ตฌ์—์„œ๋Š” PostgreSQL์ด ์•„๋‹Œ ClickHouse ๋ฐ์ดํ„ฐ ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์–ด๋–ค ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์–ป์„ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ClickHouse๋ฅผ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ƒ์‚ฐ์„ฑ ์ด์ ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. FDW(Foreign Data Wrapper)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ PostgreSQL์—์„œ ClickHouse์— ์•ก์„ธ์Šคํ•˜๋ฉด ์ด๋Ÿฌํ•œ ์ด์ ์ด ๊ณ„์† ์œ ์ง€๋ฉ๋‹ˆ๊นŒ?

์—ฐ๊ตฌ๋œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ™˜๊ฒฝ์€ PostgreSQL v11, clickhousedb_fdw ๋ฐ ClickHouse ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ž…๋‹ˆ๋‹ค. ๊ถ๊ทน์ ์œผ๋กœ PostgreSQL v11์—์„œ๋Š” clickhousedb_fdw๋ฅผ ํ†ตํ•ด ClickHouse ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ๋ผ์šฐํŒ…๋˜๋Š” ๋‹ค์–‘ํ•œ SQL ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ FDW์˜ ์„ฑ๋Šฅ์ด ๊ธฐ๋ณธ PostgreSQL ๋ฐ ๊ธฐ๋ณธ ClickHouse์—์„œ ์‹คํ–‰๋˜๋Š” ๋™์ผํ•œ ์ฟผ๋ฆฌ์™€ ์–ด๋–ป๊ฒŒ ๋น„๊ต๋˜๋Š”์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

ํด๋ฆญํ•˜์šฐ์Šค ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

ClickHouse๋Š” ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ ‘๊ทผ ๋ฐฉ์‹๋ณด๋‹ค 100~1000๋ฐฐ ๋น ๋ฅธ ์„ฑ๋Šฅ์„ ๋‹ฌ์„ฑํ•˜๊ณ  XNUMX์ดˆ ์ด๋‚ด์— XNUMX์–ต ๊ฐœ๊ฐ€ ๋„˜๋Š” ํ–‰์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์˜คํ”ˆ ์†Œ์Šค ์ปฌ๋Ÿผํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค.

Clickhousedb_fdw

clickhousedb_fdw - ClickHouse ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(FDW)์˜ ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ ๋ž˜ํผ๋Š” Percona์˜ ์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ํ”„๋กœ์ ํŠธ์˜ GitHub ์ €์žฅ์†Œ์— ๋Œ€ํ•œ ๋งํฌ์ž…๋‹ˆ๋‹ค..

XNUMX์›”์— ์ €๋Š” FDW์— ๋Œ€ํ•ด ๋” ์ž์„ธํžˆ ์„ค๋ช…ํ•˜๋Š” ๋ธ”๋กœ๊ทธ๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค..

๋ณด์‹œ๋‹ค์‹œํ”ผ ์ด๋Š” PostgreSQL v11 ์„œ๋ฒ„์˜ ClickHouse ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ SELECT ๋ฐ INSERT INTO๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ClickHouse์šฉ FDW๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

FDW๋Š” ์ง‘๊ณ„ ๋ฐ ์กฐ์ธ๊ณผ ๊ฐ™์€ ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ฆฌ์†Œ์Šค ์ง‘์•ฝ์ ์ธ ์ž‘์—…์— ์›๊ฒฉ ์„œ๋ฒ„์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ฑ๋Šฅ์ด ํฌ๊ฒŒ ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค.

๋ฒค์น˜๋งˆํฌ ํ™˜๊ฒฝ

  • ์Šˆํผ๋งˆ์ดํฌ๋กœ ์„œ๋ฒ„:
    • ์ธํ…”ยฎ ์ œ์˜จยฎ CPU E5-2683 v3 @ 2.00GHz
    • 2์†Œ์ผ“ / 28์ฝ”์–ด / 56์Šค๋ ˆ๋“œ
    • ๋ฉ”๋ชจ๋ฆฌ : RAM์˜ 256GB
    • ์Šคํ† ๋ฆฌ์ง€: ์‚ผ์„ฑ SM863 1.9TB ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ SSD
    • ํŒŒ์ผ ์‹œ์Šคํ…œ: ext4/xfs
  • OS: Linux sblade01 4.15.0-42-generic #45~16.04.1-Ubuntu
  • PostgreSQL: ๋ฒ„์ „ 11

๋ฒค์น˜๋งˆํฌ ํ…Œ์ŠคํŠธ

์ด ํ…Œ์ŠคํŠธ์—๋Š” ์ผ๋ถ€ ๊ธฐ๊ณ„ ์ƒ์„ฑ ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  1987๋…„๋ถ€ํ„ฐ 2018๋…„๊นŒ์ง€์˜ "๋ณด๊ณ ๋œ ์ž‘์—…์ž ์‹œ๊ฐ„๋ณ„ ์ƒ์‚ฐ์„ฑ" ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ์ œ๊ณต๋˜๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ.

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํฌ๊ธฐ๋Š” 85GB์ด๋ฉฐ 109๊ฐœ ์—ด๋กœ ๊ตฌ์„ฑ๋œ ํ•˜๋‚˜์˜ ํ…Œ์ด๋ธ”์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋ฒค์น˜๋งˆํฌ ์ฟผ๋ฆฌ

ClickHouse, clickhousedb_fdw ๋ฐ PostgreSQL์„ ๋น„๊ตํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•œ ์ฟผ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Q#
์ฟผ๋ฆฌ์— ์ง‘๊ณ„ ๋ฐ ๊ทธ๋ฃนํ™” ๊ธฐ์ค€์ด ํฌํ•จ๋จ

Q1
SELECT DayOfWeek, count(*) AS c FROM ontime WHERE ์—ฐ๋„ >= 2000 AND ์—ฐ๋„ <= 2008 GROUP BY DayOfWeek ORDER BY c DESC;

Q2
SELECT DayOfWeek, count(*) AS c FROM ontime WHERE DepDelay>10 AND Year >= 2000 AND Year <= 2008 GROUP BY DayOfWeek ORDER BY c DESC;

Q3
SELECT ์ถœ๋ฐœ์ง€, ๊ฐœ์ˆ˜(*) AS c FROM ontime WHERE DepDelay>10 AND Year >= 2000 AND Year <= 2008 GROUP BY Origin ORDER BY c DESC LIMIT 10;

Q4
SELECT ์บ๋ฆฌ์–ด, ๊ฐœ์ˆ˜() ์ •์‹œ๋ถ€ํ„ฐ DepDelay>10 AND ์—ฐ๋„ = 2007 GROUP BY Carrier ORDER BY count() ์„ค๋ช…;

Q5
SELECT a.์บ๋ฆฌ์–ด, c, c2, c1000/c2 as 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 c3 ์„ค๋ช…์œผ๋กœ;

Q6
SELECT a.์บ๋ฆฌ์–ด, c, c2, c1000/c2 as c3 FROM( ์บ๋ฆฌ์–ด ์„ ํƒ, ๊ฐœ์ˆ˜() AS c FROM ontime WHERE DepDelay>10 AND Year >= 2000 AND Year <= 2008 GROUP BY Carrier) a INNER JOIN ( SELECT Carrier, count(*) AS c2 FROM ontime WHERE Year >= 2000 AND Year <= 2008 GROUP BY ์บ๋ฆฌ์–ด ) b on a.Carrier=b.Carrier ORDER BY c3 DESC;

Q7
SELECT Carrier, avg(DepDelay) * 1000 AS c3 FROM ์ •์‹œ WHERE Year >= 2000 AND Year <= 2008 GROUP BY Carrier;

Q8
SELECT ์—ฐ๋„, ํ‰๊ท (DepDelay) FROM ์ •์‹œ GROUP BY ์—ฐ๋„;

Q9
์—ฐ๋„๋ฅผ ์„ ํƒํ•˜๊ณ  ์—ฐ๋„๋ณ„ ์ •์‹œ ๊ทธ๋ฃน์—์„œ c1์œผ๋กœ ๊ณ„์‚ฐ(*)ํ•ฉ๋‹ˆ๋‹ค.

Q10
SELECT avg(cnt) FROM (SELECT ์—ฐ๋„,์›”,count(*) AS cnt FROM ontime WHERE DepDel15=1 GROUP BY ์—ฐ๋„,์›”) a;

Q11
avg(c1) from (๋…„,์›”๋ณ„ ์ •์‹œ ๊ทธ๋ฃน์—์„œ c1๋กœ ์—ฐ,์›”, ๊ฐœ์ˆ˜(*) ์„ ํƒ) a;

Q12
SELECT OriginCityName, DestCityName, count(*) AS c FROM ontime GROUP BY OriginCityName, DestCityName ORDER BY c DESC LIMIT 10;

Q13
SELECT OriginCityName, count(*) AS c FROM ontime GROUP BY OriginCityName ORDER BY c DESC LIMIT 10;

์ฟผ๋ฆฌ์— ์กฐ์ธ์ด ํฌํ•จ๋˜์–ด ์žˆ์Œ

Q14
SELECT a.์—ฐ๋„, c1/c2 FROM ( ์—ฐ๋„ ์„ ํƒ, ๊ฐœ์ˆ˜()1000 as c1 from ontime WHERE DepDelay>10 GROUP BY Year) a INNER JOIN (์—ฐ๋„ ์„ ํƒ, ontime GROUP BY Year์—์„œ c2๋กœ ๊ณ„์‚ฐ(*)) b on a.Year=b.Year ORDER BY a.Year;

Q15
SELECT a."์—ฐ๋„", c1/c2 FROM ( "์—ฐ๋„" ์„ ํƒ, ๊ฐœ์ˆ˜()1000 as c1 FROM Fontime WHERE โ€œDepDelayโ€>10 GROUP BY โ€œ์—ฐ๋„โ€) a INNER JOIN(โ€œ์—ฐ๋„โ€ ์„ ํƒ, count(*)๋ฅผ c2 FROM Fontime GROUP BY โ€œ์—ฐ๋„โ€๋กœ ์„ ํƒ) b on a.โ€์—ฐ๋„โ€=b. "๋…„๋„";

ํ‘œ-1: ๋ฒค์น˜๋งˆํฌ์— ์‚ฌ์šฉ๋œ ์ฟผ๋ฆฌ

์ฟผ๋ฆฌ ์‹คํ–‰

๋‹ค์Œ์€ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค์ •(์ธ๋ฑ์Šค๊ฐ€ ์žˆ๊ฑฐ๋‚˜ ์—†๋Š” 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

ํ‘œ-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 ์ ˆ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ORDER BY ์ ˆ์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  Q-14 ๋ฐ Q-15 ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ORDER BY ์ ˆ์ด ์—†์œผ๋ฉด ์™„๋ฃŒ ์‹œ๊ฐ„์€ 259ms์ด๊ณ  ORDER BY ์ ˆ์ด ์žˆ์œผ๋ฉด 1364212์ž…๋‹ˆ๋‹ค. ์ด ์ฟผ๋ฆฌ๋ฅผ ๋””๋ฒ„๊น…ํ•˜๊ธฐ ์œ„ํ•ด ๋‘ ์ฟผ๋ฆฌ๋ฅผ ๋ชจ๋‘ ์„ค๋ช…ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์—ฌ๊ธฐ์— ์„ค๋ช… ๊ฒฐ๊ณผ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

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

Q15: ORDER BY ์ ˆ์ด ์—†๋Š” ์ฟผ๋ฆฌ

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๋Š” PostgreSQL์—์„œ ClickHouse์˜ ์„ฑ๋Šฅ ์ด์ ์„ ์ œ๊ณตํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. clickhousedb_fdw๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์•ฝ๊ฐ„์˜ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์žˆ๊ธฐ๋Š” ํ•˜์ง€๋งŒ ์ด๋Š” ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ClickHouse ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‹คํ–‰ํ•˜์—ฌ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์„ฑ๋Šฅ๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋˜ํ•œ PostgreSQL์˜ fdw๊ฐ€ ํƒ์›”ํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•œ๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธ์‹œ์ผœ ์ค๋‹ˆ๋‹ค.

Clickhouse๋ฅผ ํ†ตํ•œ ํ…”๋ ˆ๊ทธ๋žจ ์ฑ„ํŒ… https://t.me/clickhouse_ru
PostgreSQL์„ ์‚ฌ์šฉํ•œ ํ…”๋ ˆ๊ทธ๋žจ ์ฑ„ํŒ… https://t.me/pgsql

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€