Yn yr astudiaeth hon, roeddwn i eisiau gweld pa welliannau perfformiad y gallwn i eu cyflawni trwy ddefnyddio ffynhonnell ddata ClickHouse yn hytrach na PostgreSQL. Rwy'n gwybod y manteision perfformiad rwy'n eu cael o ClickHouse. A fydd y manteision hyn yn cael eu cadw os byddaf yn cyrchu ClickHouse o PostgreSQL gan ddefnyddio lapio data allanol (FDW)?
Yr amgylcheddau cronfa ddata sy'n cael eu hastudio yw PostgreSQL v11, clickhousedb_fdw, a chronfa ddata ClickHouse. Yn y pen draw, byddwn yn rhedeg amrywiol ymholiadau SQL o PostgreSQL v11, wedi'u llwybro trwy ein clickhousedb_fdw, i gronfa ddata ClickHouse. Yna byddwn yn gweld sut mae perfformiad yr FDW yn cymharu â'r un ymholiadau a weithredir yn PostgreSQL brodorol a ClickHouse brodorol.
Cronfa Ddata Clickhouse
Mae ClickHouse yn system rheoli cronfa ddata ffynhonnell agored, sy'n seiliedig ar golofnau, a all gyflawni perfformiad 100-1000 gwaith yn gyflymach na dulliau cronfa ddata traddodiadol, ac sy'n gallu prosesu dros biliwn o resi mewn llai nag eiliad.
Clickhousedb_fdw
clickhousedb_fdw — Mae Lapio Data Allanol Cronfa Ddata ClickHouse, neu FDW, yn brosiect ffynhonnell agored gan Percona. .
.
Fel y gwelwch, mae hyn yn darparu FDW ar gyfer ClickHouse sy'n eich galluogi i DDEWIS o, a MEWNOSOD I, gronfa ddata ClickHouse o weinydd PostgreSQL v11.
Mae FDW yn cefnogi nodweddion uwch fel crynhoadau ac ymuno. Mae hyn yn gwella perfformiad yn sylweddol trwy ddefnyddio adnoddau gweinydd o bell ar gyfer y gweithrediadau hyn sy'n defnyddio llawer o adnoddau.
Amgylchedd meincnod
- Gweinydd Supermicro:
- Intel® Xeon® CPU E5-2683 v3 @ 2.00GHz
- 2 soced / 28 craidd / 56 edau
- Cof: 256GB o RAM
- Storio: Samsung SM863 1.9TB Enterprise SSD
- System ffeiliau: ext4/xfs
- OS: Linux smblade01 4.15.0-42-generig #45~16.04.1-Ubuntu
- PostgreSQL: fersiwn 11
Profion meincnod
Yn lle defnyddio set ddata a gynhyrchwyd gan beiriant ar gyfer y prawf hwn, fe wnaethom ddefnyddio'r data "Cynhyrchiant dros Amser a Adroddwyd gan Amser Gweithredwr" o 1987 i 2018. Gallwch gael mynediad at y data .
Maint y gronfa ddata yw 85GB, gan ddarparu un tabl gyda 109 o golofnau.
Ymholiadau Meincnod
Dyma'r ymholiadau a ddefnyddiais i gymharu ClickHouse, clickhousedb_fdw a PostgreSQL.
Q#
Mae'r ymholiad yn cynnwys crynodebau ac yn grwpio yn ôl
Q1
SELECT DayOfWeek, count(*) AS c O ontime WHERE Blwyddyn >= 2000 A Blwyddyn <= 2008 GRŴPIWCH YN ÔL DayOfWeek GORCHYMYN YN ÔL c DISGRIFIAD;
Q2
DEWIS DiwrnodO'rWythnos, cyfrif(*) FEL c O amser WHERE DepDelay>10 A Blwyddyn >= 2000 A Blwyddyn <= 2008 GRŴPIWCH YN ÔL DiwrnodO'rWythnos GORCHYMYN YN ÔL c DISGRIFIAD;
Q3
SELECT Origin, count(*) AS c O ontime WHERE DepDelay>10 A Blwyddyn >= 2000 A Blwyddyn <= 2008 GRWP YN ÔL Origin GORCHYMYN GAN c DESC TERFYN 10;
Q4
DEWIS Cludwr, cyfrif() O amser ar amser LLE Mae oedi dadlwytho>10 A Blwyddyn = 2007 GRŴPIWCH GAN Gludwr GORCHYMYN GAN cyfrif() DISGRIFIAD;
Q5
DEWIS a.Cludwr, c, c2, c1000/c2 fel c3 O (DEWIS Cludwr, cyfrif() FEL c O amser WHERE DepDelay>10 A Blwyddyn=2007 GRŴP GAN Gludwr ) a YMUNIANT MEWNOL ( SELECT Carrier,count(*) FEL c2 O amser WHERE Blwyddyn=2007 GRŴP GAN Gludwr)b ar a.Cludwr=b.Cludwr GORCHYMYN GAN c3 DISGRIFIAD;
Q6
DEWIS a.Cludwr, c, c2, c1000/c2 fel c3 O (DEWIS Cludwr, cyfrif() AS c O amser WHERE DepDelay>10 A Blwyddyn >= 2000 A Blwyddyn <= 2008 GROUP BY Carrier) a INNER JOIN ( SELECT Carrier, count(*) AS c2 O amser WHERE Blwyddyn >= 2000 A Blwyddyn <= 2008 GROUP BY Carrier ) b ar a.Carrier=b.Carrier ORDER BY c3 DESC;
Q7
SELECT Carrier, avg(DepDelay) * 1000 AS c3 O ontime WHERE Blwyddyn >= 2000 A Blwyddyn <= 2008 GRŴP GAN Carrier;
Q8
DEWIS Blwyddyn, cyf(Oedi Gwahardd) O amser GRŴP GAN Flwyddyn;
Q9
dewis Blwyddyn, cyfrif(*) fel c1 o'r grŵp amser-amser yn ôl Blwyddyn;
Q10
SELECT avg(cnt) O (SELECT Blwyddyn,Mis,cyfrif(*) AS cnt O amser WHERE DepDel15=1 GRŴP YN ÔL Blwyddyn,Mis) a;
Q11
dewiswch avg(c1) o (dewiswch Flwyddyn,Mis,cyfrif(*) fel c1 o'r grŵp amser yn ôl Blwyddyn,Mis) a;
Q12
SELECT OriginCityName, DestCityName, count(*) AS c O ontime GROUP BY OriginCityName, DestCityName ORDER BY c DESC LIMIT 10;
Q13
SELECT OriginCityName, count(*) AS c O ontime GROUP BY OriginCityName ORCHYMYN GAN c DESC TERFYN 10;
Mae'r ymholiad yn cynnwys ymuno
Q14
DEWISWCH a.Blwyddyn, c1/c2 O (dewiswch Flwyddyn, cyfrif()1000 fel c1 o amser LLE Mae Oedi Ymlaen > 10 GROUP BY Year) a INNER JOIN (dewiswch Blwyddyn, cyfrif(*) fel c2 o amser GROUP BY Year) b ar a.Year=b.Year ORDER BY a.Year;
Q15
DEWISWCH a.”Blwyddyn”, c1/c2 O ( dewiswch “Blwyddyn”, cyfrif()1000 fel c1 O fontime WHERE “DepDelay”>10 GROUP BY “Blwyddyn”) a INNER JOIN (dewiswch “Blwyddyn”, count(*) fel c2 O fontime GROUP BY “Blwyddyn” ) b ar a.”Blwyddyn”=b.”Blwyddyn”;
Tabl-1: Ymholiadau a ddefnyddiwyd yn y meincnod
Gweithrediadau ymholiadau
Dyma'r canlyniadau ar gyfer pob ymholiad pan gaiff ei redeg mewn gwahanol osodiadau cronfa ddata: PostgreSQL gyda a heb fynegeion, ClickHouse brodorol, a clickhousedb_fdw. Dangosir amser mewn milieiliadau.
Q#
PostgreSQL
PostgreSQL (Mynegai)
CliciwchHouse
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
Tabl-1: Amser a gymerwyd i gyflawni'r ymholiadau a ddefnyddiwyd yn y meincnod
Gweld canlyniadau
Mae'r graff yn dangos amser gweithredu'r ymholiad mewn milieiliadau. Mae'r echelin-x yn dangos rhif yr ymholiad o'r tablau uchod, ac mae'r echelin-y yn dangos amser gweithredu mewn milieiliadau. Dangosir canlyniadau ClickHouse a data a gafwyd o Postgres gan ddefnyddio clickhousedb_fdw. Mae'r tabl yn dangos gwahaniaeth sylweddol rhwng PostgreSQL a ClickHouse, ond gwahaniaeth lleiaf posibl rhwng ClickHouse a clickhousedb_fdw.

Mae'r graff hwn yn dangos y gwahaniaeth rhwng ClickhouseDB a clickhousedb_fdw. Ar gyfer y rhan fwyaf o ymholiadau, nid yw gorbenion FDW mor uchel ac nid yw'n arwyddocaol o gwbl, ac eithrio ar gyfer C12. Mae'r ymholiad hwn yn cynnwys uniadau a chymal ORDER BY. Oherwydd y cymal ORDER BY, nid yw GROUP/BY ac ORDER BY yn cael eu gwthio i lawr i ClickHouse.
Yn Nhabl 2, gwelwn naid mewn amser yn ymholiadau Q12 a Q13. Unwaith eto, mae hyn yn cael ei achosi gan y cymal ORDER BY. I gadarnhau hyn, rhedais ymholiadau Q-14 a Q-15 gyda a heb y cymal ORDER BY. Heb y cymal ORDER BY, yr amser cwblhau yw 259 ms, tra gyda'r cymal ORDER BY, mae'n 1364212 ms. I ddadfygio'r ymholiad hwn, rwy'n egluro'r ddau ymholiad, a dangosir y canlyniadau yma.
C15: Heb y Cymal GORCHYMYN GAN
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";
C15: Ymholiad Heb Gymal 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)
C14: Ymholiad Gyda Chymal 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";
C14: Cynllun Ymholiad gyda Chymal 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)
Allbwn
Mae canlyniadau'r arbrofion hyn yn dangos bod ClickHouse yn cynnig perfformiad gwirioneddol dda, ac mae clickhousedb_fdw yn dod â manteision perfformiad ClickHouse i PostgreSQL. Er bod rhywfaint o orbenion wrth ddefnyddio clickhousedb_fdw, mae'n ddibwys ac yn gymharol â'r perfformiad a gyflawnir wrth redeg yn frodorol ar gronfa ddata ClickHouse. Mae hyn hefyd yn cadarnhau bod fdw yn PostgreSQL yn darparu canlyniadau rhagorol.
Sgwrs Telegram ar Clickhouse
Sgwrs Telegram PostgreSQL
Ffynhonnell: hab.com
