แแ แแแแปแแแถแแแทแแแแถแแแ แแแแปแแ แแแแพแแแถแแแแแแแขแแถแแขแแปแแแแแแแแขแถแ แแแแแแ แแถแแแแแแแแพแแแแแแแทแแแแแแ ClickHouse แแถแแถแ PostgreSQL แ แแแแปแแแนแแแธแขแแแแแแแแแแแแแแทแแแถแแแแแแแแปแแแแฝแแแถแแแธแแถแแแแแพแแแแถแแ ClickHouse แ แแพแขแแแแแแแแแแแแแถแแแแแแแนแแแแแแแแแฌแแ แแแแแทแแแพแแแแปแแ แผแแแแแพ ClickHouse แแธ PostgreSQL แแแแแแแพ Foreign Data Wrapper (FDW)?
แแแทแแแแถแแแผแแแแแถแแแทแแแแแแแแแแแถแแแทแแแแถแแบ PostgreSQL v11, clickhousedb_fdw แแทแแแผแแแแแถแแแทแแแแแแ ClickHouse แ แแธแแแแปแ แแธ PostgreSQL v11 แแพแแแนแแแแแพแแแถแแแแแฝแ SQL แแแแแแแแแแแแแแผแแแถแแแแ clickhousedb_fdw แแแแแแพแแแ แแถแแแแผแแแแแถแแแทแแแแแแ ClickHouse แ แแแแแถแแแแแแพแแแนแแแพแแแธแแแแแแแแแถแแขแแปแแแแแแแแ FDW แแแแแแแแแแ แแนแแแแแฝแแแผแ แแแแถแแแแแแแปแแแแแพแแแถแแแ แแแแปแ PostgreSQL แแพแ แแทแ ClickHouse แแพแแ
แแผแแแแแถแแแทแแแแแแ Clickhouse
ClickHouse แแบแแถแแแแแแแแแแแแแแแแแแแผแแแแแถแแแทแแแแแแ columnar แแแแแแแพแแ แแ แแแแขแถแ แแแแแแ แแถแแแผแแแถแแขแแปแแแแ 100-1000 แแแแฟแแแถแแแทแแธแแถแแแแแแแผแแแแแถแแแทแแแแแแแแแแแแแธ แแแแแถแแแแแแแแถแแแแแพแแแถแแแพแแฝแแแฝแแแถแแแแถแแแแแปแแแแแแแแแทแ แแถแแแฝแแแทแแถแแธแ
Clickhousedb_fdw
clickhousedb_fdw - แแแแ
แแแแทแแแแแแแแถแแแแแ
แแแแแถแแแแผแแแแแถแแแทแแแแแแ ClickHouse แฌ FDW แแบแแถแแแแแแแแแแแแแพแแ
แแ แแธ Percona แ
แแผแ แแแแขแแแแแนแแแพแ แแถแแแแแแแผแ FDW แแแแแถแแ ClickHouse แแแแขแแปแแแแถแแฑแแ SELECT แแธ แแทแแแแแ แผแแแ แแแแปแแแผแแแแแถแแแทแแแแแแ ClickHouse แแธแแแถแแแธแแแ PostgreSQL v11 แ
FDW แแถแแแแแแปแแแถแแแแแแทแแแแแแแแผแ แแถ แแแปแ แแทแแ แผแแแฝแแ แแแแแแแพแขแแแแแแแพแแกแพแแแแถแแแแแถแแแแผแแแถแแขแแปแแแแแแแแแแแพแแแแถแแแแแแถแแแธแแแแแธแ แแแแถแแแแแแถแแแแแแแทแแแแแทแแถแแแแแแนแแแแขแแแแพแแแแถแแแถแแแแแแ
แแแทแแแแถแแแแแแแแถแ
- แแแถแแแธแแแ Supermicroแ
- แแแธแแธแแผ Intelยฎ Xeonยฎ E5-2683 v3 @ 2.00GHz
- 2 แแแแ / 28 แแแแผแ / 56 แแแแแแแแกแถแ
- แแแแแผแแธแ แแแแแแแ แ แจ แแธแแถแแ
- แแแ แแแแแปแแ Samsung SM863 1.9TB Enterprise SSD
- แแแแแแแแแฏแแแถแแ ext4/xfs
- แแแแแแแแแแแแแทแแแแแทแแถแแ Linux smblade01 4.15.0-42-generic #45~16.04.1-ubuntu
- PostgreSQLแ แแแแ แกแก
แแถแแแแแพแแแแแแแแ
แแแแฝแแฑแแแแถแแแแแพแแแแปแแแทแแแแแแแแแแแแแแพแแแแแแแถแแแธแแแฝแแ
แแแฝแแแแแแถแแแแถแแแแแพแแแแแแแแ แแพแแแถแแแแแพแแทแแแแแแ "แแแทแแแถแแแถแแแแแแแแถแแแแแถแแแถแแแถแแแแแธแแแแแแแแแทแแแแแทแแถแ" แแธแแแแถแ 1987 แแแแแแแถแ 2018 แ แขแแแแขแถแ
แ
แผแแแแแพแแทแแแแแแ
แแแ แโแแผแแแแแถแโแแทแแแแแแโแแบ 85 GB แแแโแแแแแโแแถแแถแโแแฝแโแแ 109 แแฝแโแแแ
แแแแฝแแแแ
แแแแแบแแถแแแแฝแแแแแแแแปแแแถแแแแแพแแพแแแแธแแแแแแแแ ClickHouse, clickhousedb_fdw แแทแ PostgreSQL แ
Q#
แแแแฝแแแถแแแแปแ แแทแแแแแปแแแแ
Q1
แแแแพแแแพแ DayOfWeek, แแถแแ(*) แแถ c แแธแแแแแแถแแแแแแแถแ >= 2000 แแทแแแแแถแ <= 2008 แแแแปแแแถแ DayOfWeek แแแแแถแแแ c DESC;
Q2
แแแแพแแแพแ DayOfWeek, แแถแแ(*) แแถ c แแธแแแแแแแแพแแถแ แแแ DepDelay>10 แแทแแแแแถแ>= 2000 แแทแแแแแถแ <= 2008 แแแแปแแแถแแแแแแแแแแแแถแ แ แแแแแถแแแ c DESC;
Q3
แแแแพแแแพแแแแแแแแพแ, แแถแแ(*) แแถ c แ
แถแแแแธแแแแแแแแ แแแ DepDelay>10 แแทแแแแแถแ>= 2000 แแทแแแแแถแ <= 2008 แแแแปแแแถแแแแแถแแแแพแ BY c DESC LIMIT 10;
Q4
แแแแพแแแพแแแแแปแแ แแปแแแนแแแแแแผแ แแถแแ() แ
แถแแแแธแแแแแแถแแแ DepDelay> 10 แแทแแแแแถแ = 2007 แแแแปแแแแแแแแปแแ แแปแแแนแแแแแแผแ แแถแแแแแแถแแทแแแแแแถแแ() DESC;
Q5
แแแแพแแแพแ a.Carrier, c, c2, c1000/c2 แแถ c3 แแธ ( SELECT แแแแปแแ แแปแแแนแแแแแแผแ แแถแแ() แแแแปแแแถแแแถ c แ
แถแแแแธแแแแแแแแ 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 แแแ c3 DESC;
Q6
แแแแพแแแพแ a.Carrier, c, c2, c1000/c2 แแถ c3 แแธ ( SELECT แแแแปแแ แแปแแแนแแแแแแผแ แแถแแ() แแแแปแแแถแแแถ c แแธแแแแแแแถแแแ DepDelay>10 แแทแแแแแถแ>= 2000 แแทแแแแแถแ <= 2008 แแถแแแแปแแแแแแแแปแแ แแปแแแนแแแแแแผแ) แแถแแ
แผแแแฝแแแถแแแแแปแ (แแแแพแแแพแแแแแปแแ แแปแแแนแแแแแแผแ แแถแแ(*) แแถ c2 แแธแแแแแแแแแแแแแถแแแแ
แแถแแแแถแ>= 2000 แแทแแแแแถแ <= 2008 Carrier ) b on a.Carrier=b.Carrier ORDER BY c3 DESC;
Q7
SELECT Carrier, avg(DepDelay) * 1000 AS c3 แ
แถแแแแธแแแแแแถแแแแแแแถแ>= 2000 แแทแแแแแถแ <= 2008 GROUP BY Carrier;
Q8
SELECT Year, avg(DepDelay) แแธแแแแปแแแถแแแแแแแแถแแถแแแแแถแ;
Q9
แแแแพแแแพแแแแแถแ แแถแแ(*) แแถ c1 แแธแแแแปแแแถแแแแแแแแแแแแถแ;
Q10
SELECT avg(cnt) FROM (SELECT Year, Month, count(*) AS cnt FROM ontime WHERE DepDel15=1 GROUP BY Year, Month) a;
Q11
แแแแพแแแพแ avg(c1) แแธ (แแแแพแแแพแแแแแถแ แแ แแถแแ(*) แแถ c1 แแธแแแแปแแแถแแแแแแแแแแแแถแ แแ) a;
Q12
SELECT OriginCityName, DestCityName, count(*) แแถ c แแธแแแแปแแแถแแแแแแแแ OriginCityName, DestCityName แแแแแถแแแ c DESC LIMIT 10;
Q13
แแแแพแแแพแ OriginCityName, count(*) แแถ c แแธแแแแปแแแถแแแแแแแแ OriginCityName แแแแแถแแแ c DESC LIMIT 10;
แแแแฝแแแถแแแถแแ แผแแแฝแ
Q14
แแแแพแแแพแ a.Year, c1/c2 FROM (แแแแพแแแพแแแแแถแ, แแถแแ()1000 แแถ c1 แ
แถแแแแธแแแแแแแแ WHERE DepDelay> 10 GROUP BY Year) a Inner JOIN (แแแแพแแแพแ Year, count(*) as c2 from ontime GROUP BY Year) b on a.Year=b.Year ORDER BY a.Year;
Q15
แแแแพแแแพแ โแแแแถแโ, c1/c2 แแธ (แแแแพแแแพแ โแแแแถแโ, แแถแแ()1000 as c1 FROM fontime where โDepDelayโ> 10 GROUP BY โYearโ) a Inner JOIN (แแแแพแแแพแ โYearโ แแถแแ(*) แแถ c2 แแธ fontime GROUP BY โYearโ) b on 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
Table-1: แแแแแแแถแแแแแแแผแแแแแ แแแแแทแแแแแทแแแแฝแแแแแแแแพแแแแปแแแแ
แแพแแแแแแแ
แแแแถแ แแแแแแ แถแแแแแแแแถแแแแแทแแแแแทแแแแฝแแแทแแแถแแธแแธแแทแแถแแธ แขแแแแ X แแแแ แถแแแแแแแแฝแแแธแแถแแถแแแถแแแพ แ แพแแขแแแแ Y แแแแ แถแแแแแแแแถแแแแแทแแแแแทแแทแแแถแแทแแแแธแแทแแถแแธแ แแแแแแ ClickHouse แแทแแแทแแแแแแแแแแแถแแแถแแแแแธ postgres แแแแแแแพ clickhousedb_fdw แแแแผแแแถแแแแแ แถแแ แแธแแถแแถแแขแแแแขแถแ แแพแแแพแแแถแแถแแแถแแแปแแแแแถแแแถแแแแแถแแแแแถแ PostgreSQL แแทแ ClickHouse แแแปแแแแแแถแแแปแแแแแถแแทแ แแฝแ แแแถแ ClickHouse แแทแ clickhousedb_fdw แ
แแแแถแ แแแแแแแแแ แถแแแธแแถแแแปแแแแแถแแแถแ ClickhouseDB แแทแ clickhousedb_fdw แ แแ แแแแปแแแแแฝแแแถแแ แแแพแ แแถแแ แแแถแแแพ FDW แแทแแแแแแแแ แ แพแแแแแพแแแแแทแแแแแถแแ แแพแแแแแแ Q12 แ แแแแฝแแแแแแฝแแแแแ แผแแแถแแแแแถแแ แแทแแแถแแแแแแถแแทแแแถแแแแแถแ แแแแแถแแแ ORDER BY GROUP/BY clause, ORDER BY แแทแแแแแแถแแแแ ClickHouse แแแ
แแ แแแแปแแแถแแถแแแธ 2 แแพแแแพแแแแแแแแถแแแแแแแปแแแแแฝแ Q12 แแทแ Q13 แ แแถแแแแธแแแแแแแ แแแแแบแแแแแถแแแแแธ ORDER BY clauseแ แแพแแแแธแแแแแถแแแแฟแแแแ แแแแปแแแถแแแแแพแแแถแแแแแฝแ Q-14 แแทแ Q-15 แแแแแถแ แแทแแแแแถแ ORDER BY clauseแ แแพแแแแถแ ORDER BY clause แแแแแแแถแแแแ แแแแบ 259ms แ แพแแแถแแฝแแแนแ ORDER BY clause แแถแแบ 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: แแแแแถแแแแแฝแแแถแแฝแ 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 แแแแแแแผแแแแแแแแแแแแขแ
แแถแแแแแแแถแ Telegram แแถแแแแ Clickhouse
แแถแแแแแแแถแ Telegram แแแแแแแพ PostgreSQL
แแแแแ: www.habr.com