แแ แแแแแแแจแ แแแแแแแ แแแแแฎแ, แแฃ แ แ แแแฃแแฏแแแแกแแแแก แแแฆแฌแแแ แจแแแซแแแแแแ 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-แกแแแ.
แ แแแแ แช แฎแแแแแ, แแก แฃแแ แฃแแแแแงแแคแก ClickHouse-แก FDW-แก, แ แแแแแแช แกแแจแฃแแแแแแก แแซแแแแก SELECT-แแแ แแ แฉแแกแแแ ClickHouse แแแแแชแแแแ แแแแ PostgreSQL v11 แกแแ แแแ แแแแ.
FDW แแฎแแ แก แฃแญแแ แก แแแฌแแแแแ แคแฃแแฅแชแแแแก, แ แแแแ แแชแแ แแแ แแแแชแแ แแ แจแแแ แแแแ. แแก แแแแจแแแแแแแแแ แแฃแแฏแแแแกแแแก แจแแกแ แฃแแแแแก แแแกแขแแแชแแฃแ แ แกแแ แแแ แแก แ แแกแฃแ แกแแแแก แแแแแงแแแแแแ แแ แ แแกแฃแ แกแแ แแแขแแแกแแฃแ แ แแแแ แแชแแแแแกแแแแก.
แกแแแ แแแแขแแชแแ แแแ แแแ
- แกแฃแแแ แแแแ แ แกแแ แแแ แ:
- Intelยฎ Xeonยฎ CPU E5-2683 v3 @ 2.00 GHz
- 2 แกแแแแขแ / 28 แแแ แแแ / 56 แซแแคแ
- แแแฎแกแแแ แแแ: 256 GB แแแแ แแขแแฃแแ แแแฎแกแแแ แแแ
- แจแแแแฎแแ: Samsung SM863 1.9TB Enterprise SSD
- แคแแแแฃแ แ แกแแกแขแแแ: ext4/xfs
- แแแแ แแชแแฃแแ แกแแกแขแแแ: Linux smblade01 4.15.0-42-generic #45~16.04.1-Ubuntu
- PostgreSQL: แแแ แกแแ 11
แกแแแ แแแแขแแชแแ แขแแกแขแแแ
แแแแก แแแชแแแแ, แ แแ แแแแแแแแงแแแแแแแ แแแแฅแแแแ แแแแแ แแ แแแฃแแ แแแแแชแแแแ แแแแ แแแ แแ แขแแกแขแแกแแแแก, แฉแแแ แแแแแแแงแแแแ "แแ แแแฃแฅแขแแฃแแแแ แแ แแจแ แแแฎแกแแแแแฃแแ แแแแ แแขแแ แแก แแ แแแ" แแแแแชแแแแแ 1987 แฌแแแแแ 2018 แฌแแแแแ. แจแแแแซแแแแ แแแแแชแแแแแแก แฌแแแแแ
แแแแแชแแแแ แแแแแก แแแแแ 85 GB, แ แแแแแแช แจแแแชแแแก 109 แกแแแขแแก แแ แ แชแฎแ แแแก.
แกแแแ แแแแขแแชแแ แแแแฎแแแแแแ
แแฅ แแ แแก แแแแฎแแแแแแ, แ แแแแแแแช แแแแแแแงแแแ ClickHouse, clickhousedb_fdw แแ PostgreSQL แจแแกแแแแ แแแแแ.
Q#
แแแแฎแแแแ แจแแแชแแแก แแแ แแแแขแแแก แแ แฏแแฃแคแก
Q1
SELECT DayOfWeek, count(*) AS c FROM ontime WHERE แฌแแแ >= 2000 แแ แฌแแแ <= 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
แแแ แฉแแแ แแแแ แแขแแ แ, แแแแแแแแ() FROM ontime WHERE DepDelay>10 แแ แฌแแแ = 2007 แฏแแฃแคแ แแแแ แแขแแ แแก แแแฎแแแแแ แจแแแแแแ แ แแแแแแแแแก แแแฎแแแแแ () DESC;
Q5
SELECT a.Carrier, c, c2, c1000/c2 แ แแแแ แช 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.ORDER BY c3 DESC;
Q6
SELECT a.Carrier, c, c2, c1000/c2 แ แแแแ แช 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 GROUP BY <= 2008 Carrier ) b on a.Carrier=b.Carrier ORDER BY c3 DESC;
Q7
SELECT Carrier, avg(DepDelay) * 1000 AS c3 FROM ontime WHERE แฌแแแ >= 2000 แแ แฌแแแ <= 2008 GROUP BY Carrier;
Q8
SELECT แฌแแแ, แกแแจแฃแแแ (DepDelay) FROM ontime GROUP BY Year;
Q9
แแแ แฉแแแ แฌแแแ, แแแแแแแแแ(*) แ แแแแ แช c1 แแ แแแแ แฏแแฃแคแแแแ แฌแแแก แแแฎแแแแแ;
Q10
SELECT avg(cnt) FROM (SELECT แฌแแแ, แแแ, แ แแแแแแแแ(*) AS cnt FROM ontime WHERE DepDel15=1 GROUP BY BY, Month) 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.Year, c1/c2 FROM ( แแแ แฉแแแ แฌแแแ, แแแแแแ()1000 แ แแแแ แช c1 แแ แแแแแ WHERE DepDelay>10 GROUP BY By Year) แจแแแ แจแแแ แแแแ (แแแ แฉแแแ แฌแแแ, แแแแแแแแแ (*) แ แแแแ แช c2 แแ แแแแแ GROUP BY By Year ) b on a.Year=b.Year ORDER BY A.Year;
Q15
SELECT a.โYearโ, c1/c2 FROM ( แแแ แฉแแแ โYearโ, count()1000 แ แแแแ แช c1 FROM fontime WHERE โDepDelayโ>10 GROUP BY โYearโ) แจแแแ แจแแแ แแแแ (แแแ แฉแแแ โYearโ, แแแแแแแแแ(*) แ แแแแ แช c2 FROM fontime GROUP BY โYearโ ) b on a.โYearโ=b. "แฌแแแ";
แชแฎแ แแแ-1: แแแแฎแแแแแแ, แ แแแแแแแช แแแแแแงแแแแแ แแแแฉแแแ แแจแ
แจแแแแแฎแแแก แจแแกแ แฃแแแแ
แแฅ แแแชแแแฃแแแ แแแแแแฃแแ แแแแฎแแแแแก แจแแแแแแแ แแแแแชแแแแ แแแแแก แกแฎแแแแแกแฎแแ แแแ แแแแขแ แแแจแ แแแจแแแแแกแแก: PostgreSQL แแแแแฅแกแแแแ แแ แแแก แแแ แแจแ, แแจแแแแแฃแ แ ClickHouse แแ clickhousedb_fdw. แแ แ แแแฉแแแแแแแ แแแแแฌแแแแแจแ.
Q#
PostgreSQL
PostgreSQL (แแแแแฅแกแแ แแแฃแแ)
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
แชแฎแ แแแ-1: แแแแฉแแแ แแจแ แแแแแงแแแแแฃแแ แแแแฎแแแแแแแก แจแแกแ แฃแแแแแก แแ แ
แจแแแแแแแแก แแแฎแแ
แแ แแคแแแ แแฉแแแแแแก แแแแฎแแแแแก แจแแกแ แฃแแแแแก แแ แแก แแแแแฌแแแแแจแ, X แฆแแ แซแ แแฉแแแแแแก แแแแฎแแแแแก แ แแชแฎแแก แแแแแ แชแฎแ แแแแแแแแ, แฎแแแ Y แฆแแ แซแ แแฉแแแแแแก แจแแกแ แฃแแแแแก แแ แแก แแแแแฌแแแแแจแ. แแแฉแแแแแแแ ClickHouse-แแก แจแแแแแแแ แแ แแแแแชแแแแแ, แ แแแแแแแช แแแฆแแแฃแแแ postgres-แแแ clickhousedb_fdw-แแก แแแแแงแแแแแแ. แชแฎแ แแแแแแ แฎแแแแแ, แ แแ แแแแ แแแแกแฎแแแแแแแ PostgreSQL-แกแ แแ ClickHouse-แก แจแแ แแก, แแแแ แแ แแแแแแแแฃแ แ แแแแกแฎแแแแแแ ClickHouse-แกแ แแ clickhousedb_fdw-แก แจแแ แแก.
แแก แแ แแคแแแ แแฉแแแแแแก แแแแกแฎแแแแแแแก 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 แแฃแแฅแขแแก แแแ แแจแ แแแกแ แฃแแแแแก แแ แ แแ แแก 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 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 แแแแแแแแแ ClickHouse-แแก แจแแกแ แฃแแแแแก แกแแ แแแแแแก PostgreSQL-แแแ. แแแฃแฎแแแแแแ แแแแกแ, แ แแ clickhousedb_fdw-แแก แแแแแงแแแแแแกแแก แแ แแก แแแ แแแแฃแแ แแแแแแแแแ, แแก แฃแแแแจแแแแแแ แแ แจแแแแ แแแแแแ ClickHouse แแแแแชแแแแ แแแแแจแ แแจแแแแแฃแ แแ แแแจแแแแแ แแแฆแฌแแฃแ แจแแกแ แฃแแแแแกแแแ. แแก แแกแแแ แแแแกแขแฃแ แแแก, แ แแ fdw PostgreSQL-แจแ แแซแแแแ แจแแกแแแแจแแแ แจแแแแแแแก.
Telegram แฉแแขแ Clickhouse-แแก แกแแจแฃแแแแแแ
Telegram แฉแแขแ PostgreSQL-แแก แแแแแงแแแแแแ
แฌแงแแ แ: www.habr.com