á¤ááąáˇááŹáážáŻáá˝ááşá PostgreSQL áááş ClickHouse ááąááŹáááşá¸ááźá áşááᯠáĄááŻáśá¸ááźáŻááźááşá¸ááźááˇáş ááťá˝ááşáŻááşááážááááŻááşáááˇáş á á˝ááşá¸ááąáŹááşáááşááźážááˇáşáááşáážáŻááťáŹá¸ááᯠááźááˇáşáážáŻáááŻááŤáááşá ClickHouse áááŻáĄááŻáśá¸ááźáŻáá˛áˇáĄá፠áááşáááŻá á˝ááşá¸ááąáŹááşáááş áĄááťááŻá¸ááťáąá¸áá°á¸áá˝áą ááááŻááşáá˛áááŻáᏠááááŤáááşá External Data Wrapper (FDW) ááᯠáĄááŻáśá¸ááźáŻá PostgreSQL ááž ClickHouse áááŻáˇáááşááąáŹááşááŤá áááŻáĄááťááŻá¸ááťáąá¸áá°á¸ááťáŹá¸ááᯠááááşá¸ááááşá¸áááŻááşááŤáááşááŹá¸á
ááťá˝ááşáŻááşáááŻáˇ á áŻáśá ááşá¸á á áşááąá¸áááˇáş ááąááŹááąáˇá áşáááşáááşá¸ááťááşááťáŹá¸áááş PostgreSQL v11á clickhousedb_fdw áážááˇáş ClickHouse database áá áşááŻááźá áşáááşá ááąáŹááşááŻáśá¸áá˝ááşá ááťá˝ááşáŻááşáááŻáˇáááş ááťá˝ááşáŻááşáááŻáˇá clickhousedb_fdw áážááááˇáş ClickHouse ááąááŹááąáˇá áşáááŻáˇ ááźááşáááşá¸áá˝áŹá¸ááąáŹ PostgreSQL v11 ááž áĄááťááŻá¸ááťááŻá¸ááąáŹ SQL queries ááťáŹá¸ááᯠááŻááşááąáŹááşááŤáááşá áááŻáˇááąáŹááşáá˝ááş FDW á á á˝ááşá¸ááąáŹááşáááşáááş áá°áááşá¸ PostgreSQL áážááˇáş áá°áááşá¸ ClickHouse áá˝ááş ááŻááşááąáŹááşááąáááˇáş áá°ááŽááąáŹááąá¸áá˝ááşá¸ááťáŹá¸áážááˇáş áážááŻááşá¸áážááşááźááˇáşááŤáááşá
Clickhouse ááąááŹááąáˇá áş
ClickHouse áááş áááŻá¸ááŹááąááŹááąáˇá áşááťááşá¸áááşáážáŻááťáŹá¸áááş áĄá 100 ááž 1000 áĄááááŻááźááşááąáŹ á á˝ááşá¸ááąáŹááşáááşááᯠááážááááŻááşáááˇáş áá˝ááˇáşáááşá¸áááşá¸ááźá áşááąáŹáşááśáĄááźáąááśááąááŹááąáˇá áş á áŽááśáááˇáşáá˝á˛áážáŻá áá áşáá áşááŻááźá áşááźáŽá¸ áá áşá áášáááˇáşáĄáá˝ááşá¸ áĄáááşá¸áá áşááŽááŽááśááťáąáŹáşááᯠááŻááşááąáŹááşáááŻááşá á˝ááşá¸áážááááşá
Clickhousedb_fdw
clickhousedb_fdw - ClickHouse Database External Data Wrapper áááŻáˇáááŻááş FDW áááş Percona ááž open source áááąáŹááťááşáá áşááŻááźá áşáááşá .
.
áááşáá˝áąáˇááźááşááááˇáşáĄáááŻááşá¸á áááşá¸áááş SELECT áážáá˝ááˇáşááźáŻááźáŽá¸ PostgreSQL v11 ááŹááŹááž ClickHouse ááąááŹááąáˇá áşááᯠáááˇáşáá˝ááşá¸áááˇáş ClickHouse áĄáá˝ááş FDW ááᯠááąáŹááşááśáˇááąá¸áááşá
FDW áááş áĄá áŻáááŻááşáážááˇáş ááŤáááşááźááşá¸áá˛áˇáááŻáˇááąáŹ áĄáááˇáşááźááˇáşáĄááşášááŤáááşááťáŹá¸ááᯠááśáˇáááŻá¸ááąá¸áááşá áááşá¸áááş áĄáááşá¸áĄááźá áş-áĄááąá¸ááąá¸ááŻááşááąáŹááşáážáŻááťáŹá¸áĄáá˝ááş áĄááąá¸ááááşá¸ááŹááŹáááşá¸ááźá áşááťáŹá¸ááᯠáĄááŻáśá¸ááźáŻááźááşá¸ááźááˇáş á á˝ááşá¸ááąáŹááşáááşááᯠááááááŹáᏠáááŻá¸áááşá áąáááşá
á áśáááşáážááşááťááşáááşáááşá¸ááťááş
- á
á°ááŤáááŻááşááááŻááŹááŹ-
- IntelÂŽ XeonÂŽ CPU E5-2683 v3 @ 2.00GHz
- 2 sockets / 28 cores / 56 threads
- Memory: 256GB RAM
- áááŻáážáąáŹááşáážáŻ- Samsung SM863 1.9TB Enterprise SSD
- áááŻááşá áá áş- ext4/xfs
- OS- Linux smblade01 4.15.0-42-generic #45~16.04.1-Ubuntu
- PostgreSQL- ááŹá¸áážááşá¸ 11
á áśáážáŻááşá¸á á áşááąá¸áážáŻááťáŹá¸
á¤á ááşá¸áááşáážáŻáĄáá˝ááş á ááşáážááŻááşááŻááşááŹá¸ááąáŹ ááąááŹáĄáá˝á˛áĄááťááŻáˇááᯠáĄááŻáśá¸ááźáŻáááˇáşáĄá áŹá¸á ááťá˝ááşáŻááşáááŻáˇáááş "áĄáąáŹáşáááąááŹáĄááťáááşáážááąáŹáşááźááąáŹáĄááťáááşáážááˇáşáĄááťáž ááŻááşááŻááşá á˝ááşá¸áĄáŹá¸ááťáŹá¸" ááąááŹááᯠ1987 ááž 2018 ááŻáážá áşáĄáá áĄááŻáśá¸ááźáŻááŹá¸ááŤáááşá ááąááŹááᯠáááşáááşááąáŹááşááźááˇáşáážáŻáááŻááşááŤáááşá .
ááąááŹááąáˇá áşáĄáá˝ááşáĄá áŹá¸áážáŹ 85GB ááźá áşááźáŽá¸ áááŹá¸áá áşááŻáá˝ááş ááąáŹáşááś 109 ááŻááŤáážááááşá
á áśááźááąá¸áá˝ááşá¸ááťáŹá¸
á¤áááşáážáŹ ClickHouseá clickhousedb_fdw áážááˇáş PostgreSQL áááŻáˇááᯠáážááŻááşá¸áážááşáááş áĄááŻáśá¸ááźáŻáá˛áˇááąáŹ ááąá¸áá˝ááşá¸ááťáŹá¸ááźá áşáááşá
Q#
Query áá˝ááş áĄá
áŻáááŻááşáážááˇáş áĄáŻááşá
áŻáĄáááŻááş ááŤáážááááşá
Q1
DayOfWeek áááŻáá˝áąá¸ááťááşááŤá count(*) áĄáááŻááşá¸ c ááž áĄááťáááşáážááşáááşáážáŹáážáááááşá¸ >= 2000 áážááˇáş Year <= 2008 Group BY DayOfWeek ORDER BY c DESC;
Q2
DayOfWeek áááŻáá˝áąá¸ááťááşááŤá count(*) as c ááž áĄááťáááşáážááş DepDelay>10 áážááˇáş Year >= 2000 áážááˇáş Year <= 2008 Group BY DayOfWeek Order BY c DESC;
Q3
ááŹá
áşááźá
áşááᯠSELECTá count(*) áĄááźá
áş c áĄááťáááşááąáŤáşááąááŹááž DepDelay>10 áážááˇáş Year >= 2000 áážááˇáş Year <= 2008 áá°áááşá¸áážáŹáá°áážáŻáĄáááŻááş áĄáŻááşá
áŻáá˝á˛áˇ c DESC LIMIT 10;
Q4
SELECT áááşááąáŹááşáážáŻááąá¸áá°á ááąáá˝ááş() áĄááťáááşáážááşááąááŹááž DepDelay> 10 áážááˇáş Year = 2007 áááşááŽáᏠáážáŹáá°áážáŻáĄáááŻááş áĄáŻááşá
áŻáá˝á˛áˇááźááşá¸() DESC;
Q5
a.Carrierácác2ác áááŻáá˝áąá¸ááŤá1000/c2 ááž c3 áĄááźá
áş ( SELECT Carrier á count() áĄááťáááşááąáŤáşáĄááťáááşáážá
áááˇáşáĄáááŻááşá¸ c10 WHERE WHERE Year=2007 AND Year=2 GROUP BY Carrier ) áá
áşáŚá¸áĄáá˝ááşá¸áááŻááşá¸áá°á¸ááąáŤááşá¸ááźááşá¸ ( SELECT Carrierácount(*) AS c2007 ááž áĄááťáááşáážááş WHERE Year=3 GROUP BY Carrier)b áá˝ááş a.Carrier=b.CarrierXNUMX DE
Q6
a.Carrierácác2ác áááŻáá˝áąá¸ááŤá1000/c2 ááž c3 áĄááźá
áş ( SELECT Carrier á count() áĄááťáááşááąáŤáşáĄááťáááşáážá
áááˇáşáĄáááŻááşá¸ C áááş áĄááťáááşáážááşááąááŹááž DepDelay>10 áážááˇáş Year >= 2000 áážááˇáş Year <= 2008 áĄáá˝á˛áˇááž áááşááąáŹááşáá°) áá
áşáŚá¸áĄáá˝ááşá¸áááŻááşá¸áá°á¸ááąáŤááşá¸ááźááşá¸ ( SELECT Carrierá count(*) AS c2 AS on time WHERE Year >= 2000 AND Year <= 2008 áážááˇáş B ááąáŤáşáážá Carrier 3 a.Carrier=b.áááşááŽáᏠáážáŹáá°áážáŻ cXNUMX DESC;
Q7
SELECT áááşááąáŹááşáážáŻááąá¸áá°á avg(DepDelay) * 1000 AS c3 áááş áĄááťáááşááąáŤáşááąááŹááž áážá
áşáá
áşáážá
áş >= 2000 áážááˇáş áážá
áş <= 2008 áááşááŽááŹáĄáá˝á˛áˇááźááˇáş áĄáá˝á˛áˇáááŻááşá
Q8
SELECT Yeará avg(DepDelay) áĄááťáááşááąáŤáşáĄáŻááşá
áŻáĄáááŻááş áážá
áşáĄáááŻááşá
Q9
áážá
áşáĄáááŻááş áĄááťáááşáážááşáĄáŻááşá
áŻááž áá
áşáážá
áşá ááąáá˝ááş(*) ááᯠáá˝áąá¸ááťááşááŤá
Q10
SELECT avg(cnt) FROM (SELECT YearáMonth,count(*) AS cnt AS cnt ááž áĄááťáááşáážááş DEPDel15=1 áĄáŻááşá
áŻáĄáááŻááş áá
áşáážá
áşáá) a;
Q11
a;
Q12
OriginCityNameá DestCityNameá count(*) áĄáááŻááşá¸ c ááᯠáá°áááşá¸ááźááŻáˇáĄáááşááźááˇáş áĄááťáááşááąáŤáşáĄáŻááşá
áŻá DestCityName áážáážáŹáá°áážáŻ c DESC áááˇáşáááşááťááş 10;
Q13
OriginCityName ááᯠSELECTá count(*) áĄááąááźááˇáş c ááž áĄááťáááşáᎠáĄáŻááşá
áŻáá˝á˛áˇááźááşá¸ áá°áááşá¸ááźááŻáˇáĄáááş áážáŹáá°áážáŻ c DESC LIMIT 10;
Query áá˝ááş Joins ááťáŹá¸ááŤáážááááşá
Q14
SELECT a.Yeará c1/c2 FROM (áážá
áşáááŻáá˝áąá¸ááŤá ááąáá˝ááşááŤ()1000 áĄááťáááşááąáŤáşááž C1 áĄááźá
áş 10 WHERE DepDelay>2 GROUP BY Year) a Inner Join (áá
áşáážá
áşááᯠáá˝áąá¸ááťááşááŤá áĄááťáááşáĄáááŻááş GROUP BY Year ááž cXNUMX áĄááźá
áş cXNUMX áĄááźá
áş) b on a.Year=b.Year áážáŹáááş BY a.Year;
Q15
áá˝áąá¸ aâYearâá c1/c2 ááž (âáážá
áşâ áááŻáá˝áąá¸ááŤá ááąáá˝ááşááŤ()1000 áĄááźá
áş c1 áá˛ááž âDepDelayâ> âYearâ áĄáááŻááş áĄáŻááşá
ᯠ10) áĄáá˝ááşá¸áááŻááşá¸ Join (âYearâ áááŻáá˝áąá¸ááťááşááŤá count(*) áĄááźá
áş c2 áĄááźá
áş âYearâ ááźááˇáş áĄáŻááşá
áŻáá˝á˛áˇááŤ) b áá˝ááş a.âYearâ=b.âYearâ;
áááŹá¸-á- á áśáááşáážááşááťááşáá˝ááş áĄááŻáśá¸ááźáŻááŹá¸ááąáŹ ááąá¸áá˝ááşá¸ááťáŹá¸
ááąá¸áá˝ááşá¸ááᯠáá˝ááşááťááşááźááşá¸á
ááá°ááŽááąáŹ ááąááŹááąáˇá áşáááşáááşááťáŹá¸áá˝ááş ááŻááşááąáŹááşáááˇáşáĄá፠ááąá¸áá˝ááşá¸áá áşááŻá áŽá ááááşááťáŹá¸ááźá áşáááş- 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
áááŹá¸-á- á áśáááşáážááşáážáŻáá˝ááş áĄááŻáśá¸ááźáŻáááˇáş ááąá¸áá˝ááşá¸ááťáŹá¸ááᯠááŻááşááąáŹááşáááş áĄááťáááşáá°áááşá
ááááşááťáŹá¸áááŻááźááˇáşááŤá
ááááşáááş ááąá¸ááźááşá¸áážáŻááŻááşááąáŹááşááťáááşááᯠááŽááŽá áášáááˇáşááťáŹá¸ááźááˇáşááźááááşá X áááşáááŻá¸áááş áĄáááşááŤáááŹá¸ááťáŹá¸ááž á áŻáśá ááşá¸áážáŻááśááŤááşáááŻááźáááźáŽá¸ Y áááşáááŻá¸áááş ááŻááşááąáŹááşááťáááşááᯠááŽááŽá áášáááˇáşááźááˇáşááźááááşá ClickHouse ááááşááťáŹá¸áážááˇáş clickhousedb_fdw ááᯠáĄááŻáśá¸ááźáŻá postgres áážááá°ááąáŹááąááŹáááŻááźáááŹá¸áááşá áááŹá¸áážá PostgreSQL áážááˇáş ClickHouse áĄááźáŹá¸ ááźáŽá¸ááŹá¸ááąáŹ ááźáŹá¸ááŹá¸ááťááş áážááááşááᯠááťá˝ááşáŻááşáááŻáˇ áá˝áąáˇáááŻááşááąáŹáşáááşá¸ ClickHouse áážááˇáş clickhousedb_fdw áĄááźáŹá¸ áĄáááşá¸áááşáᏠáá˝áŹááźáŹá¸ááťááşáážááááşá

á¤ááááşáááş ClickhouseDB áážááˇáş clickhousedb_fdw áĄááźáŹá¸ ááźáŹá¸ááŹá¸ááťááşááᯠááźááááşá ááąá¸áá˝ááşá¸áĄááťáŹá¸á áŻáá˝ááşá FDW áááş Q12 áážáá˝á˛á áááŻááťážááźáŽá¸ááŹá¸ááźáŽá¸ ááááŹáááşáážáŹá¸ááźááşá¸ááážáááŤá á¤ááąá¸ááźááşá¸ááťááşáá˝ááş ááŤáááşáážáŻááťáŹá¸áážááˇáş ORDER BY clause ááŤáááşáááşá ORDER BY clause ááźáąáŹááˇáşá Group/BY áážááˇáş ORDER BY áááŻáˇáááş ClickHouse áááŻáˇ ááááşá¸áá˝áŹá¸ááŤá
áááŹá¸ 2 áá˝ááşá ááąá¸áá˝ááşá¸ááťáŹá¸ Q12 áážááˇáş Q13 áá˝ááş áĄááťáááşáá áşááŻááŻááşáá˝áŹá¸áááşáááŻáá˝áąáˇááźááşááááşá ááááşá á¤áááşáážáŹ ORDER BY clause ááźáąáŹááˇáşááźá áşáááşá áááşá¸áááŻáĄáááşááźáŻáááşá ááťá˝ááşáŻááşáááş Q-14 áážááˇáş Q-15 áááŻáˇááᯠORDER BY clause áááŤáᲠá áŻáśá ááşá¸ááąá¸ááźááşá¸ááŹá¸ááŤáááşá ORDER BY clause áááŤáá˛á ááźáŽá¸ááŻáśá¸ááťáááşáááş 259 ms ááźá áşááźáŽá¸á ORDER BY clause ááźááˇáşá áááşá¸áááş 1364212 ms ááźá áşáááşá á¤ááąá¸áá˝ááşá¸ááᯠáĄáážáŹá¸áážáŹáááşá ááťá˝ááşáŻááşáááş ááąá¸áá˝ááşá¸áážá áşááŻááŻáśá¸ááᯠáážááşá¸ááźááźáŽá¸ á¤áááşáážáŹ áážááşá¸ááźááťááşá ááááşááťáŹá¸ááźá áşáááşá
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- áĄáááŻááşáĄáááŻááş áážáŹáá°áážáŻááźááˇáş ááąá¸ááźááşá¸áážáŻ
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 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 áááş PostgreSQL ááž ClickHouse áá á˝ááşá¸ááąáŹááşáááşáĄááťááŻá¸ááťáąá¸áá°á¸ááťáŹá¸áááŻááąá¸ááąáŹááşáááşá clickhousedb_fdw áááŻáĄááŻáśá¸ááźáŻááąáŹáĄááŤáá˝ááş áĄááťááŻáˇááąáŹááąááŹááťáŹá¸áá˝ááş áĄááťáŻáśá¸áááşááąáŹáşáááşá¸ ClickHouse ááąááŹááąáˇá áşáá˝ááş áá°áááşá¸áĄáááŻááşá¸áááşáááşáááˇáşáĄá፠ááážááááˇáşá á˝ááşá¸ááąáŹááşáááşáážááˇáş áážááŻááşá¸áážááşááťážááş áááşá¸ááŤá¸ááŤáááşá áááşá¸áááş PostgreSQL áážá fdw áááş áá°á¸áá°á¸ááźáŹá¸ááźáŹá¸ááááşááťáŹá¸ááᯠááąá¸ááąáŹááşááźáąáŹááşá¸áááşá¸ áĄáááşááźáŻááŤáááşá
Clickhouse áá˝ááş Telegram chat
PostgreSQL áá˝ááş Telegram chat
source: www.habr.com
