Kontsulta analitikoen errendimendua probatzea PostgreSQL, ClickHouse eta clickhousedb_fdw (PostgreSQL)

Azterketa honetan, ClickHouse datu-iturburu bat erabiliz PostgreSQL baino errendimendu hobekuntzak lor litezkeen ikusi nahi nuen. Badakit ClickHouse erabiltzeak lortzen ditudan produktibitate onurak. Onura hauek jarraituko dute PostgreSQL-tik ClickHouse-ra atzitzen badut Atzerriko Datuen Bilgarri (FDW) erabiliz?

Aztertutako datu-base-inguruneak PostgreSQL v11, clickhousedb_fdw eta ClickHouse datu-basea dira. Azken finean, PostgreSQL v11-tik gure clickhousedb_fdw-tik ClickHouse datu-basera bideraturiko SQL kontsulta ezberdinak exekutatuko ditugu. Ondoren, ikusiko dugu FDWren errendimendua PostgreSQL jatorrizko eta ClickHouse natiboetan exekutatzen diren kontsulta berdinekin alderatzen den.

Clickhouse Datu-basea

ClickHouse kode irekiko zutabeen datu-baseen kudeaketa sistema bat da, eta datu-baseen ikuspegi tradizionalek baino 100-1000 aldiz azkarrago lor dezakeen errendimendua, mila milioi errenkada baino gehiago prozesatzeko gai dena segundo batean baino gutxiagoan.

Clickhousedb_fdw

clickhousedb_fdw - ClickHouse datu-baserako edo FDW kanpoko datu bilgarria Perconaren kode irekiko proiektu bat da. Hona hemen proiektuaren GitHub biltegirako esteka.

Martxoan blog bat idatzi nuen, gure FDWri buruz gehiago esaten dizuna.

Ikusiko duzun bezala, honek ClickHouserako FDW bat eskaintzen du, PostgreSQL v11 zerbitzariko ClickHouse datu-basetik HAUTATU eta txertatu ahalbidetzen duena.

FDW-k funtzio aurreratuak onartzen ditu, hala nola agregatu eta batzea. Honek errendimendua nabarmen hobetzen du urruneko zerbitzariaren baliabideak baliabide askoko eragiketa hauetarako erabiliz.

Erreferentziazko ingurunea

  • Supermicro zerbitzaria:
    • Intel® Xeon® CPU E5-2683 v3 @ 2.00GHz
    • 2 entxufe / 28 nukleo / 56 hari
    • Memoria: 256 GB RAM
    • Biltegiratzea: Samsung SM863 1.9TB Enterprise SSD
    • Fitxategi-sistema: ext4/xfs
  • OS: Linux smblade01 4.15.0-42-generic #45~16.04.1-Ubuntu
  • PostgreSQL: 11. bertsioa

Erreferentziazko probak

Proba honetarako makinek sortutako datu-multzo batzuk erabili beharrean, 1987tik 2018ra bitarteko "Erakundearen araberako produktibitatea denboraren arabera jakinarazi" datuak erabili ditugu. Datuetara sar zaitezke hemen eskuragarri dagoen gure gidoia erabiliz.

Datu-basearen tamaina 85 GB da, eta 109 zutabeko taula bat eskaintzen du.

Erreferentziazko kontsultak

Hona hemen ClickHouse, clickhousedb_fdw eta PostgreSQL alderatzeko erabili ditudan kontsultak.

Q#
Kontsultak agregatuak eta Taldeka ditu

Q1
AUKERATU DayOfWeek, zenbatu(*) AS c FROM ontime WHERE Urtea >= 2000 ETA Urtea <= 2008 GROUP BY DayOfWeek ORDENA c DESC;

Q2
AUKERATU DayOfWeek, zenbatu(*) AS c FROM ontime WHERE DepDelay>10 AND Year >= 2000 AND Year <= 2008 GROUP BY DayOfWeek ORDENA c DESC;

Q3
HAUTATU Jatorria, zenbatu(*) AS c FROM ontime WHERE DepDelay>10 ETA Urtea >= 2000 ETA Urtea <= 2008 TALDEA JATORRIZKO ORDENA BY c DESC LIMIT 10;

Q4
HAUTATU Eramailea, zenbatu() FROM ontime WHERE DepDelay>10 AND Year = 2007 GROUP BY Carrier ORDER BY count() DESC;

Q5
HAUTATU a.Carrier, c, c2, c1000/c2 c3 FROM gisa ( HAUTATU Eramailea, zenbatu() 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
HAUTATU a.Carrier, c, c2, c1000/c2 c3 FROM gisa ( HAUTATU Eramailea, zenbatu() AS c FROM ontime WHERE DepDelay>10 AND Year >= 2000 AND Year <= 2008 GROUP BY Garraiolari) a INNER JOIN ( SELECT Carrier, count(*) AS c2 FROM ontime WHERE Urtea >= 2000 AND Year <= 2008 GROUP BY Garraiolari ) b on a.Carrier=b.Carrier ORDER BY c3 DESC;

Q7
SELECT Carrier, avg(DepDelay) * 1000 AS c3 FROM ontime WHERE Urtea >= 2000 ETA Urtea <= 2008 TALDEA Eramailearen arabera;

Q8
AUKERATU Urtea, batez beste (DepDelay) FROM ontime TALDEA Urtez;

Q9
hautatu Urtea, zenbatu (*) c1 gisa ontime taldetik Urtez;

Q10
SELECT avg(cnt) FROM (HAUTATU Urtea,Hilabetea,zenbaketa(*) AS cnt FROM ontime WHERE DepDel15=1 TALDEA Urtea,Hilabetea) a;

Q11
hautatu bataz (c1) tik (hautatu Urtea,Hilabetea,zenbaketa (*)) ontime taldetik c1 gisa Urtez,Hilabetez) a;

Q12
HAUTATU JatorriHiriIzena, DestCityName, count(*) AS c FROM ontime GROUP BY OriginCityName, DestCityName ORDENA BY c DESC LIMIT 10;

Q13
HAUTATU JatorriHiriIzena, zenbatu(*) AS c FROM ontime TALDEA JatorriHiriIzenaren ARABERA ORDENA c DESC LIMIT 10;

Kontsultak batuketak ditu

Q14
AUKERATU a.Year, c1/c2 FROM (hautatu Urtea, zenbatu()1000 ontimetik c1 gisa WHERE DepDelay>10 GROUP BY Year) a INNER JOIN (hautatu Urtea, zenbatu(*) ontimetik c2 GROUP BY Year ) b on a.Year=b.Year ORDENA BY a.Year;

Q15
AUKERATU a."Urtea", c1/c2 FROM (hautatu "Urtea", zenbatu()1000 as c1 FROM fonttime WHERE “DepDelay”>10 GROUP BY “Year”) a INNER JOIN (hautatu “Urtea”, zenbatu(*) c2 FROM fonttime GROUP BY “Year” ) b on a.”Year”=b. "Urtea";

Taula-1: Benchmark-ean erabilitako kontsultak

Kontsulta exekuzioak

Hona hemen datu-basearen ezarpen desberdinetan exekutatzen diren kontsulta bakoitzaren emaitzak: PostgreSQL indizeekin eta indizerik gabe, ClickHouse natiboa eta clickhousedb_fdw. Denbora milisegundotan erakusten da.

Q#
PostgreSQL
PostgreSQL (indexatua)
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. Taula: Benchmark-en erabilitako kontsultak egiteko denbora

Ikusi emaitzak

Grafikoak kontsultaren exekuzio-denbora erakusten du milisegundotan, X ardatzak goiko tauletako kontsulta-zenbakia erakusten du eta Y ardatzak exekuzio-denbora milisegundotan. ClickHouse-ren emaitzak eta postgres-etik ateratako datuak clickhousedb_fdw erabiliz erakusten dira. Taulan ikus dezakezu PostgreSQL eta ClickHouseren artean alde handia dagoela, baina ClickHouse eta clickhousedb_fdwren arteko alde minimoa.

Kontsulta analitikoen errendimendua probatzea PostgreSQL, ClickHouse eta clickhousedb_fdw (PostgreSQL)

Grafiko honek ClickhouseDB eta clickhousedb_fdw-ren arteko aldea erakusten du. Kontsulta gehienetan, FDW gainkostua ez da hain handia eta ia esanguratsua da Q12 izan ezik. Kontsulta honek juntaketak eta ORDER BY klausula ditu. ORDER BY GROUP/BY klausula dela eta, ORDER BY ez da jaisten ClickHouse-ra.

2. taulan Q12 eta Q13 kontsultetan denbora-jauzia ikusten dugu. Berriz ere, ORDER BY klausulak eragiten du. Hori baieztatzeko, Q-14 eta Q-15 kontsultak egin nituen ORDER BY klausularekin eta gabe. ORDER BY klausularik gabe osatzeko denbora 259 ms-koa da eta ORDER BY klausularekin 1364212. Kontsulta hau arazketa egiteko bi kontsultak azaltzen ari naiz eta hona hemen azalpenaren emaitzak.

15.G.: ORDEN BY klausularik gabe

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";

15.G.: ORDEN BY klausularik gabe kontsulta

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)

14.G.: Kontsulta ORDER BY klausularekin

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";

14.G.: Kontsulta Plana ORDER BY klausula duena

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)

Irteera

Esperimentu horien emaitzek erakusten dute ClickHouse-k errendimendu oso ona eskaintzen duela, eta clickhousedb_fdw-ek PostgreSQL-ren ClickHouse-ren errendimendu-onurak eskaintzen ditu. Clickhousedb_fdw erabiltzean gainkostu batzuk dauden arren, arbuiagarria da eta ClickHouse datu-basean jatorrizko exekutatuta lortzen den errendimenduaren parekoa da. Horrek ere baieztatzen du PostgreSQL-en fdw-ek emaitza bikainak ematen dituela.

Telegram txata Clickhouse bidez https://t.me/clickhouse_ru
Telegram berriketa PostgreSQL erabiliz https://t.me/pgsql

Iturria: www.habr.com

Gehitu iruzkin berria