ВСстированиС ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ аналитичСских запросов Π² PostgreSQL, ClickHouse ΠΈ clickhousedb_fdw (PostgreSQL)

Π’ этом исслСдовании я Ρ…ΠΎΡ‚Π΅Π» ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ источник Π΄Π°Π½Π½Ρ‹Ρ… ClickHouse, Π° Π½Π΅ PostgreSQL. Π― знаю, ΠΊΠ°ΠΊΠΈΠ΅ прСимущСства ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΏΡ€ΠΈ использовании ClickHouse я ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽ. Π‘ΡƒΠ΄ΡƒΡ‚ Π»ΠΈ эти прСимущСства сохранСны, Ссли я ΠΏΠΎΠ»ΡƒΡ‡Ρƒ доступ ΠΊ ClickHouse ΠΈΠ· PostgreSQL с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ внСшнСй ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… (FDW)?

Π˜ΡΡΠ»Π΅Π΄ΡƒΠ΅ΠΌΡ‹ΠΌΠΈ срСдами Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ… ΡΠ²Π»ΡΡŽΡ‚ΡΡ PostgreSQL v11, clickhousedb_fdw ΠΈ Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… ClickHouse. Π’ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ счСтС, ΠΈΠ· PostgreSQL v11 ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ SQL-запросы, ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Π΅ Ρ‡Π΅Ρ€Π΅Π· наш clickhousedb_fdw Π² Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… ClickHouse. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ, ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ FDW сравниваСтся с Ρ‚Π΅ΠΌΠΈ ΠΆΠ΅ запросами, выполняСмыми Π² Π½Π°Ρ‚ΠΈΠ²Π½ΠΎΠΌ PostgreSQL ΠΈ Π½Π°Ρ‚ΠΈΠ²Π½ΠΎΠΌ ClickHouse.

Π‘Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… Clickhouse

ClickHouse β€” это систСма управлСния Π±Π°Π·Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° основС ΠΊΠΎΠ»ΠΎΠ½ΠΎΠΊ с ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ исходным ΠΊΠΎΠ΄ΠΎΠΌ, которая ΠΌΠΎΠΆΠ΅Ρ‚ Π΄ΠΎΡΡ‚ΠΈΠ³Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π² 100-1000 Ρ€Π°Π· быстрСС, Ρ‡Π΅ΠΌ Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Ρ‹ ΠΊ Π±Π°Π·Π°ΠΌ Π΄Π°Π½Π½Ρ‹Ρ…, способная ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΠΌΠΈΠ»Π»ΠΈΠ°Ρ€Π΄Π° строк ΠΌΠ΅Π½Π΅Π΅ Ρ‡Π΅ΠΌ Π·Π° сСкунду.

Clickhousedb_fdw

clickhousedb_fdw β€” ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ° Π²Π½Π΅ΡˆΠ½ΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ… Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… ClickHouse, ΠΈΠ»ΠΈ FDW, являСтся ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ с ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ исходным ΠΊΠΎΠ΄ΠΎΠΌ ΠΎΡ‚ Percona. Π’ΠΎΡ‚ ссылка Π½Π° Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° GitHub.

Π’ ΠΌΠ°Ρ€Ρ‚Π΅ я написал Π±Π»ΠΎΠ³, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ рассказываСт Π²Π°ΠΌ большС ΠΎ нашСм FDW.

Как Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅, это обСспСчиваСт FDW для ClickHouse, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт SELECT from, ΠΈ INSERT INTO, Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… ClickHouse с сСрвСра PostgreSQL v11.

FDW ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ aggregate ΠΈ join. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ²Ρ‹ΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π·Π° счСт использования рСсурсов ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠ³ΠΎ сСрвСра для этих рСсурсоСмких ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ.

Benchmark environment

  • Supermicro server:
    • Intel® Xeon® CPU E5-2683 v3 @ 2.00GHz
    • 2 sockets / 28 cores / 56 threads
    • Memory: 256GB of RAM
    • Storage: Samsung SM863 1.9TB Enterprise SSD
    • Filesystem: ext4/xfs
  • OS: Linux smblade01 4.15.0-42-generic #45~16.04.1-Ubuntu
  • PostgreSQL: version 11

Benchmark tests

ВмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ Π½Π°Π±ΠΎΡ€ Π΄Π°Π½Π½Ρ‹Ρ…, сгСнСрированный машиной, для этого тСста, ΠΌΡ‹ использовали Π΄Π°Π½Π½Ρ‹Π΅ Β«ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, сообщаСмая ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°Β» с 1987 ΠΏΠΎ 2018 Π³ΠΎΠ΄. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ нашСго скрипта, доступного здСсь.

Π Π°Π·ΠΌΠ΅Ρ€ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… составляСт 85 Π“Π‘, обСспСчивая ΠΎΠ΄Π½Ρƒ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ΠΈΠ· 109 столбцов.

Benchmark Queries

Π’ΠΎΡ‚ запросы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ я использовал для сравнСния ClickHouse, clickhousedb_fdw ΠΈ PostgreSQL.

Q#
Query Contains Aggregates and Group By

Q1
SELECT DayOfWeek, count(*) AS c FROM ontime WHERE Year >= 2000 AND Year <= 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 Origin, count(*) AS c FROM ontime WHERE DepDelay>10 AND Year >= 2000 AND Year <= 2008 GROUP BY Origin ORDER BY c DESC LIMIT 10;

Q4
SELECT Carrier, count() FROM ontime WHERE DepDelay>10 AND Year = 2007 GROUP BY Carrier ORDER BY count() DESC;

Q5
SELECT a.Carrier, c, c2, c1000/c2 as c3 FROM ( SELECT Carrier, count() 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
SELECT a.Carrier, c, c2, c1000/c2 as c3 FROM ( SELECT Carrier, count() 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 Carrier ) b on a.Carrier=b.Carrier ORDER BY c3 DESC;

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

Q8
SELECT Year, avg(DepDelay) FROM ontime GROUP BY Year;

Q9
select Year, count(*) as c1 from ontime group by Year;

Q10
SELECT avg(cnt) FROM (SELECT Year,Month,count(*) AS cnt FROM ontime WHERE DepDel15=1 GROUP BY Year,Month) a;

Q11
select avg(c1) from (select Year,Month,count(*) as c1 from ontime group by Year,Month) 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;

Query Contains Joins

Q14
SELECT a.Year, c1/c2 FROM ( select Year, count()1000 as c1 from ontime WHERE DepDelay>10 GROUP BY Year) a INNER JOIN (select Year, count(*) as c2 from ontime GROUP BY Year ) b on a.Year=b.Year ORDER BY a.Year;

Q15
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”;

Table-1: Queries used in benchmark

Query executions

Π’ΠΎΡ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· запросов ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Π² Ρ€Π°Π·Π½Ρ‹Ρ… настройках Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…: PostgreSQL с индСксами ΠΈ Π±Π΅Π· Π½ΠΈΡ…, собствСнный ClickHouse ΠΈ clickhousedb_fdw. ВрСмя показываСтся Π² миллисСкундах.

Q#
PostgreSQL
PostgreSQL (Indexed)
ClickHouse
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

Table-1: Time taken to execute the queries used in benchmark

ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ²

Π“Ρ€Π°Ρ„ΠΈΠΊ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ врСмя выполнСния запроса Π² миллисСкундах, ось X ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½ΠΎΠΌΠ΅Ρ€ запроса ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ† Π²Ρ‹ΡˆΠ΅, Π° ось Y ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ врСмя выполнСния Π² миллисСкундах. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ClickHouse ΠΈ Π΄Π°Π½Π½Ρ‹Π΅, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ ΠΈΠ· postgres с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ 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. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€Π΄ΠΈΡ‚ΡŒ это, я Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ» запросы Q-14 ΠΈ Q-15 с ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ ORDER BY ΠΈ Π±Π΅Π· Π½Π΅Π³ΠΎ. Π‘Π΅Π· прСдлоТСния ORDER BY врСмя Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ составляСт 259 мс, Π° с ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ ORDER BY β€” 1364212. Для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ этого запроса я объясняю ΠΎΠ±Π° запроса, Π° здСсь ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ объяснСния.

Q15: Without ORDER BY Clause

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 Without ORDER BY Clause

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: Query With ORDER BY Clause

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: Query Plan with ORDER BY Clause

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. Π­Ρ‚ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ fdw Π² PostgreSQL обСспСчиваСт Π·Π°ΠΌΠ΅Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹.

Π’Π΅Π»Π΅Π³Ρ€Π°ΠΌ Ρ‡Π°Ρ‚ ΠΏΠΎ Clickhouse https://t.me/clickhouse_ru
Π’Π΅Π»Π΅Π³Ρ€Π°ΠΌ Ρ‡Π°Ρ‚ ΠΏΠΎ PostgreSQL https://t.me/pgsql

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com