Selles uuringus soovisin uurida, milliseid jĂ”udluse parandusi on vĂ”imalik saavutada, kasutades andmeallikaks ClickHouse'i, mitte PostgreSQL-i. Ma tean, millised jĂ”udluse eelised kaasnevad ClickHouse'i kasutamisega. Kas need eelised pĂŒsivad, kui pÀÀsen ClickHouse'ile PostgreSQL'ist vĂ€liste andmekestade (FDW) abil?
Uuritavad andmebaasikeskkonnad 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 nÀeme, kuidas FDW jÔudlus vÔrreldes sama pÀringuga, mis on tÀidetud kohalikus PostgreSQL-is ja kui ka kohalikus ClickHouse'is.
Clickhouse andmebaas
ClickHouse on avatud lĂ€htekoodiga veergude andmebaasisĂŒsteem, mis suudab saavutada tulemusi 100â1000 korda kiiremini kui traditsioonilised andmebaasi lĂ€henemisviisid, olles vĂ”imeline töötlema ĂŒle miljardi rida vĂ€hem kui sekundiga.
Clickhousedb_fdw
clickhousedb_fdw on ClickHouse'i vÀliste andmete kesta, vÔi FDW, avatud lÀhtekoodiga projekt, mille on loonud Percona. .
.
Nagu nÀete, pakub see FDW voor ClickHouse'ile, mis vÔimaldab SELECT from ning INSERT INTO ClickHouse andmebaasi PostgreSQL v11 serverist.
FDW toetab keerukaid funktsioone, nagu agregaat ja ĂŒhine. See suurendab jĂ”udlust, kasutades kaugarvuti ressursse nende ressursimahukate toimingute 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 Enterprise SSD
- FailisĂŒsteem: ext4/xfs
- OS: Linux smblade01 4.15.0-42-generic #45~16.04.1-Ubuntu
- PostgreSQL: versioon 11
Benchmark testid
Selle testi jaoks, selle asemel et kasutada masinaga genereeritud andmebaasi, kasutasime andmeid 'Aja tĂ€itmise tegevuse pĂ”hjal mÀÀratud jĂ”udluse kohta' 1987â2018. Te saate ligipÀÀsu andmetele .
Andmebaasi suurus on 85 GB, pakkudes ĂŒhte tabelit, kus on 109 veergu.
Benchmark pÀringud
Siin on pÀringud, mida kasutasin ClickHouse'i, clickhousedb_fdw ja PostgreSQL'i vÔrdlemiseks.
K#
PÀring sisaldab agregaatfunktsioone ja grupi jÀrgi
K1
SELECT DayOfWeek, count(*) AS c FROM ontime WHERE Year >= 2000 AND Year <= 2008 GROUP BY DayOfWeek ORDER BY c DESC;
K2
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
valida 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
valida 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 liite
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
VALI 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: KĂŒsimused, mida kasutati vĂ”rdluses
KĂŒsimuste tĂ€itmine
Siin on iga pÀringu tulemused, kui neid tÀideti erinevates andmebaasi seadetes: PostgreSQL indeksitega ja ilma, enda ClickHouse ja clickhousedb_fdw. Aeg on nÀidatud millisekundites.
K#
PostgreSQL
PostgreSQL (indekseeritud)
ClickHouse
clickhousedb_fdw
K1
27920
19634
23
57
K2
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: Aeg, mis kulus pÀringute tÀitmiseks, mida kasutati vÔrdluses
Vaata tulemusi
Graafik nĂ€itab pĂ€ringu tĂ€itmise aega millisekundites, X-telg nĂ€itab pĂ€ringu numbrit ĂŒlaltoodud tabelites ning Y-telg nĂ€itab tĂ€itmisaja millisekundites. Tulemused ClickHouse'i ja andmed, saadud Postgres'ist, kasutades clickhousedb_fdw, on nĂ€idatud. Tabelis on nĂ€ha, et PostgreSQL ja ClickHouse'i vahel on tohutu erinevus, kuid ClickHouse ja clickhousedb_fdw vahel on minimaalne erinevus.

See graafik nÀitab erinevust ClickhouseDB ja clickhousedb_fdw vahel. Enamikus pÀringutes ei ole FDW kulud eriti suured ja on vaevu mÀrgatavad, vÀlja arvatud Q12. See pÀring sisaldab liite ja ORDER BY klauslit. GROUP/BY ja ORDER BY tÔttu ei jÀeta ClickHouse'i.
Tabelis 2 nĂ€eme hĂŒpet Q12 ja Q13 pĂ€ringute ajades. Kordan, et see on pĂ”hjustatud ORDER BY lausetest. Kinnitamiseks kĂ€isin lĂ€bi pĂ€ringud Q-14 ja Q-15 nii ORDER BY lause kui ka ilma selleta. Ilma ORDER BY lauseta on lĂ”puaeg 259 ms, ja ORDER BY lauseta on see 1364212. Selle pĂ€ringu tĂ”rkeotsingu jaoks selgitan mĂ”lemat pĂ€ringut, siin on esitatud seletuse tulemused.
Q15: Ilma ORDER BY lauseteta
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 lauseteta
PĂRINGU PLaan
Hash Join (cost=2250.00..128516.06 rows=50000000 width=12)
VĂ€ljund: fontime."Year", (((count(*) * 1000)) / b.c2)
Sisemine unikaalne: tÔene Hash Cond: (fontime."Year" = b."Year")
-> VÔÔrskane (cost=1.00..-1.00 rows=100000 width=12)
VĂ€ljund: fontime."Year", ((count(*) * 1000))
Suhted: Agressiivne (fontime)
Kaugsuhtlus SQL: SELECT "Year", (count(*) * 1000) FROM "default".ontime WHERE (("DepDelay" > 10)) GROUP BY "Year"
-> Hash (cost=999.00..999.00 rows=100000 width=12)
VĂ€ljund: b.c2, b."Year"
-> AlampÀringu skaneerimine b (cost=1.00..999.00 rows=100000 width=12)
VĂ€ljund: b.c2, b."Year"
-> VÔÔrskane (cost=1.00..-1.00 rows=100000 width=12)
VĂ€ljund: fontime_1."Year", (count(*))
Suhted: Agressiivne (fontime)
Kaugsuhtlus SQL: SELECT "Year", count(*) FROM "default".ontime GROUP BY "Year"(16 rows)Q14: PĂ€ring ORDER BY lausega
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: PĂ€ringu plaan ORDER BY lausega
PĂRINGU PLaan
Merge Join (cost=2.00..628498.02 rows=50000000 width=12) Â
VĂ€ljund: fontime."Year", (((count(*) * 1000)) / (count(*)))Â Â
Sisemine unikaalne: tĂ”ene  Merge Cond: (fontime."Year" = fontime_1."Year") Â
-> Grupiagregaat (cost=1.00..499.01 rows=1 width=12)   Â
VĂ€ljund: fontime."Year", (count(*) * 1000)Â Â Â Â Â
Grupi nĂ”ue: fontime."Year"    Â
-> VÔÔrskane avalikus.fontimes (cost=1.00..-1.00 rows=100000 width=4)       Â
Kaugsuhtlus SQL: SELECT "Year" FROM "default".ontime WHERE (("DepDelay" > 10))
ORDER BY "Year" ASCÂ Â
-> Grupiagregaat (cost=1.00..499.01 rows=1 width=12)    Â
VĂ€ljund: fontime_1."Year", count(*)     GrupinĂ”ue: fontime_1."Year"    Â
-> VÔÔrskane avalikus.fontimes fontime_1 (cost=1.00..-1.00 rows=100000 width=4)Â
      Â
Kaugsuhtlus SQL: SELECT "Year" FROM "default".ontime ORDER BY "Year" ASC(16 rows)KokkuvÔte
Needuste katsetused nĂ€itavad, et ClickHouse pakub tĂ”epoolest head jĂ”udlust, samas kui clickhousedb_fdw toob PostgreSQL-i ClickHouse'i jĂ”udluse eelised. Kuigi clickhousedb_fdw kasutamisel on teatud ĂŒlevaated, on need ebaolulised ja vĂ”rreldavad jĂ”udlusega, mida saavutatakse loomuliku kĂ€ivitamisega ClickHouse andmebaasis. See kinnitab ka, et fdw PostgreSQL-is pakub suurepĂ€raseid tulemusi.
Clickhouse'i Telegrami vestlus
PostgreSQL-i Telegrami vestlus
Allikas: habr.com
