Selles uuringus soovisin uurida, milliseid jĂ”udlusparandusi on vĂ”imalik saavutada andmeallika ClickHouse'i kasutamisel PostgreSQL-i asemel. Ma tean, milliseid jĂ”udlusvĂ”lusid saan ClickHouse'i kasutamisel. Kas need eelised pĂŒsivad, kui pÀÀsen ClickHouse'ile PostgreSQL'i kaudu vĂ€lise andmekĂ€ivituse (FDW) abil?
Uuritavad andmebaasid on PostgreSQL v11, clickhousedb_fdw ja ClickHouse andmebaas. LÔppkokkuvÔttes kÀivitame PostgreSQL v11-st erinevaid SQL-pÀringuid, mis suunatakse meie clickhousedb_fdw kaudu ClickHouse andmebaasi. SeejÀrel vaatame, kuidas FDW jÔudlus vÔrreldes sama pÀringuga, mida teostatakse natiivses PostgreSQL-is ja natiivses ClickHouse'is.
ClickHouse andmebaas
ClickHouse on avatud lĂ€htekoodiga veergude pĂ”hine andmebaasi haldamise sĂŒsteem, mis vĂ”ib saavutada jĂ”udluse, mis on 100â1000 korda kiirem kui traditsioonilised andmebaasi lĂ€henemised, suudab töödelda ĂŒle miljardi rida vĂ€hem kui sekundiga.
Clickhousedb_fdw
clickhousedb_fdw on ClickHouse andmebaasi vÀline andmekÀivituse (FDW) jahutustooted, avatud lÀhtekoodiga projekt, mille on loonud Percona. .
.
Nagu nÀete, pakub see FDW ClickHouse'ile, mis vÔimaldab SELECT andmeid ja INSERT andmeid PostgreSQL v11-serverist ClickHouse andmebaasi.
FDW toetab tĂ€iustatud funktsioone, nagu aggregate ja join. See suurendab mĂ€rkimisvÀÀrselt jĂ”udlust, kasutades kaugsĂŒsteemi ressursse nende ressursimahukate operatsioonide jaoks.
Benchmark keskkond
- Supermicro server:
- IntelÂź XeonÂź CPU E5-2683 v3 @ 2.00GHz
- 2 pesa / 28 tuuma / 56 lÔime
- MĂ€lu: 256GB RAM-i
- Salvestus: Samsung SM863 1.9TB ettevÔtte SSD
- FailisĂŒsteem: ext4/xfs
- OS: Linux smblade01 4.15.0-42-generic #45~16.04.1-Ubuntu
- PostgreSQL: versioon 11
Benchmark testid
Kuna ei kasutanud mingit masinaga genereeritud andmestikku, kasutasime ĂŒhte andmestikku âAja jĂ”udlus, mida operaatori tööaja raportidâ aastatel 1987-2018. Andmetele pÀÀsete ligi .
Andmebaasi suurus on 85 GB, pakkudes ĂŒhte tabelit 109 veerust.
Benchmark pÀringud
Siin on pÀringud, mida kasutasin ClickHouse'i, clickhousedb_fdw ja PostgreSQL-i vÔrdlemiseks.
Q#
PĂ€ring sisaldab aggregaatfunktsioone ja rĂŒhmitamisi
Q1
VALI DayOfWeek, count(*) AS c FROM ontime WHERE Year >= 2000 AND Year <= 2008 GROUP BY DayOfWeek ORDER BY c DESC;
Q2
VALI DayOfWeek, count(*) AS c FROM ontime WHERE DepDelay > 10 AND Year >= 2000 AND Year <= 2008 GROUP BY DayOfWeek ORDER BY c DESC;
Q3
VALI 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
VALI Carrier, count() FROM ontime WHERE DepDelay > 10 AND Year = 2007 GROUP BY Carrier ORDER BY count() DESC;
Q5
VALI 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
VALI a.Carrier, c, c2, c1000 / c2 AS c3 FROM ( SELECT Carrier, count() AS c FROM ontime WHERE DepDelay > 10 AND Year >= 2000 AND Year = 2000 AND Year <= 2008 GROUP BY Carrier ) b ON a.Carrier = b.Carrier ORDER BY c3 DESC;
Q7
VALI Carrier, avg(DepDelay) * 1000 AS c3 FROM ontime WHERE Year >= 2000 AND Year <= 2008 GROUP BY Carrier;
Q8
VALI Year, avg(DepDelay) FROM ontime GROUP BY Year;
Q9
SELECT Year, count(*) AS c1 FROM ontime GROUP BY Year;
Q10
VALI 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
VALI OriginCityName, DestCityName, count(*) AS c FROM ontime GROUP BY OriginCityName, DestCityName ORDER BY c DESC LIMIT 10;
Q13
VALI OriginCityName, count(*) AS c FROM ontime GROUP BY OriginCityName ORDER BY c DESC LIMIT 10;
KĂŒsimus sisaldab liitumisi
Q14
VALI 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
Siin on iga pÀringu tulemused erinevates andmebaasi seadistustes: PostgreSQL koos ja ilma indeksitega, eraldi ClickHouse ning clickhousedb_fdw. Aeg on nÀidatud millisekundites.
Q#
PostgreSQL
PostgreSQL (Indekseeritud)
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
Tulemuste vaatamine
Graafik nĂ€itab pĂ€ringu tĂ€itmise aega millisekundites, X-teljel on pĂ€ringu number ĂŒlaltoodud tabelitest, Y-teljel aga tĂ€itmise aeg millisekundites. Tulemused ClickHouse'ist ja andmed, mis saadud postgres'ist clickhousedb_fdw abil, on nĂ€idatud. Tabelist on nĂ€ha, et PostgreSQL ja ClickHouse'i vahel on suur vahe, kuid ClickHouse'i ja clickhousedb_fdw vahel minimaalne vahe.

See graafik nĂ€itab, kuidas ClickhouseDB ja clickhousedb_fdw erinevad. Enamikus pĂ€ringutes ei ole FDW kulud nii suured ja vaevumĂ€rgatavad, vĂ€lja arvatud Q12. See pĂ€ring sisaldab ĂŒhendusi ja ORDER BY lauset. ORDER BY GROUP/BY ja ORDER BY ei ole teist ferrulede alla ClickHouse'i.
Tabelis 2 nĂ€eme ajahĂŒpet pĂ€ringutes Q12 ja Q13. Kordan, et see on pĂ”hjustatud ORDER BY lausest. Selle kinnitamiseks tegin pĂ€ringud Q-14 ja Q-15 koos ja ilma ORDER BY lauseta. Ilma ORDER BY lauseta on lĂ”ppemise aeg 259 ms ja ORDER BY lausaga 1364212. Selle pĂ€ringu tĂ”rkeotsingu jaoks selgitan mĂ”lemat pĂ€ringut, ja siin on antud selgituse tulemused.
Q15: Ilma ORDER BY lauseta
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: PĂ€ring ilma ORDER BY lauseta
KĂSIMUSE PLaan
Hash Join (kulu=2250.00..128516.06 ridades=50000000 laius=12)
VĂ€ljund: fontime."Aasta", (((count(*) * 1000)) / b.c2)
Sisemine ainulaadne: true Hash Cond: (fontime."Aasta" = b."Aasta")
-> VĂ€line skaneerimine (kulu=1.00..-1.00 ridades=100000 laius=12)
VĂ€ljund: fontime."Aasta", ((count(*) * 1000))
Seosed: Aadress kogumisel (fontime)
Kaugsena SQL: SELECT "Aasta", (count(*) * 1000) FROM "default".ontime WHERE (("DepDelay" > 10)) GROUP BY "Aasta"
-> Hash (kulu=999.00..999.00 ridades=100000 laius=12)
VĂ€ljund: b.c2, b."Aasta"
-> AlamkĂŒsimuse skaneerimine b (kulu=1.00..999.00 ridades=100000 laius=12)
VĂ€ljund: b.c2, b."Aasta"
-> VĂ€line skaneerimine (kulu=1.00..-1.00 ridades=100000 laius=12)
VĂ€ljund: fontime_1."Aasta", (count(*))
Seosed: Aadress kogumisel (fontime)
Kaugsena SQL: SELECT "Aasta", count(*) FROM "default".ontime GROUP BY "Aasta"(16 rida)Q14: KĂŒsige koos ORDER BY klausliga
bm=# EXPLAIN VERBOSE SELECT a."Aasta", c1/c2 FROM(SELECT "Aasta", count(*)*1000 AS c1 FROM fontime WHERE "DepDelay" > 10 GROUP BY "Aasta") a
INNER JOIN(SELECT "Aasta", count(*) as c2 FROM fontime GROUP BY "Aasta") b ON a."Aasta"= b."Aasta"
ORDER BY a."Aasta";Q14: KĂŒsige plaan koos ORDER BY klausliga
KĂSIMUSE PLANEERIMINE
Sulandumine (kulu=2.00..628498.02 read=50000000 laius=12)
VĂ€ljund: fontime."Aasta", (((count(*) * 1000)) / (count(*)))
Sisemine unikaalsus: tÔene Sulandumise tingimus: (fontime."Aasta" = fontime_1."Aasta")
-> GrupimÀÀramine (kulu=1.00..499.01 read=1 laius=12)
VĂ€ljund: fontime."Aasta", (count(*) * 1000)
Grupi vÔti: fontime."Aasta"
-> VÔÔrsil skaneerimine public.fontime (kulu=1.00..-1.00 read=100000 laius=4)
Kaugarvutus: SELECT "Aasta" FROM "default".ontime WHERE (("DepDelay" > 10))
TELLIMUS KOHA JĂRGI "Aasta" ASC
-> GrupimÀÀramine (kulu=1.00..499.01 read=1 laius=12)
VÀljund: fontime_1."Aasta", count(*) Grupi vÔti: fontime_1."Aasta"
-> VÔÔrsil skaneerimine public.fontime fontime_1 (kulu=1.00..-1.00 read=100000 laius=4)
Kaugarvutus: SELECT "Aasta" FROM "default".ontime TELLIMUS KOHA JĂRGI "Aasta" ASC(16 read)KokkuvĂ”te
Need eksperimendid nÀitavad, et ClickHouse pakub tÔeliselt head jÔudlust ja clickhousedb_fdw toob PostgreSQL-se kaasa ClickHouse'i jÔudluse eelised. Kuigi clickhousedb_fdw kasutamisel on teatud overhead, on need ebaolulised ja vÔrreldavad jÔudlusega, mis saavutatakse ClickHouse'i andmebaasis loomulikus kÀivitamises. See tÔendab ka, et fdw PostgreSQL-s tagab suurepÀraseid tulemusi.
Clickhouse'i Telegrami vestlus
PostgreSQLi Telegrami vestlus
Allikas: habr.com
