Profi perfformiad ymholiadau dadansoddol yn PostgreSQL, ClickHouse a clickhousedb_fdw (PostgreSQL)

Yn yr astudiaeth hon, roeddwn i eisiau gweld pa welliannau perfformiad y gellid eu cyflawni trwy ddefnyddio ffynhonnell ddata ClickHouse yn hytrach na PostgreSQL. Rwy'n gwybod y buddion cynhyrchiant a gaf o ddefnyddio ClickHouse. A fydd y buddion hyn yn parhau os byddaf yn cyrchu ClickHouse o PostgreSQL gan ddefnyddio Lapiwr Data Tramor (FDW)?

Yr amgylcheddau cronfa ddata a astudiwyd yw PostgreSQL v11, clickhousedb_fdw a chronfa ddata ClickHouse. Yn y pen draw, o PostgreSQL v11 byddwn yn rhedeg amrywiol ymholiadau SQL wedi'u cyfeirio trwy ein clickhousedb_fdw i gronfa ddata ClickHouse. Yna byddwn yn gweld sut mae perfformiad FDW yn cymharu â'r un ymholiadau sy'n rhedeg yn PostgreSQL brodorol a ClickHouse brodorol.

Cronfa Ddata Clickhouse

Mae ClickHouse yn system rheoli cronfa ddata golofnog ffynhonnell agored a all gyflawni perfformiad 100-1000 gwaith yn gyflymach na dulliau cronfa ddata traddodiadol, sy'n gallu prosesu dros biliwn o resi mewn llai nag eiliad.

Cliciwchhousedb_fdw

clickhousedb_fdw - Mae'r deunydd lapio data allanol ar gyfer cronfa ddata ClickHouse, neu FDW, yn brosiect ffynhonnell agored gan Percona. Dyma ddolen i gadwrfa GitHub y prosiect.

Ym mis Mawrth ysgrifennais flog sy'n dweud mwy wrthych am ein FDW.

Fel y gwelwch, mae hyn yn darparu FDW ar gyfer ClickHouse sy'n caniatáu SELECT o gronfa ddata ClickHouse o'r gweinydd PostgreSQL v11, a INSERT INTO.

Mae FDW yn cefnogi nodweddion uwch fel agreg ac ymuno. Mae hyn yn gwella perfformiad yn sylweddol trwy ddefnyddio adnoddau'r gweinydd pell 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 edafedd
    • Cof: 256GB o RAM
    • Storio: Samsung SM863 1.9TB Enterprise SSD
    • System ffeiliau: ext4/xfs
  • OS: Linux sblade01 4.15.0-42-generig #45~16.04.1-Ubuntu
  • PostgreSQL: fersiwn 11

Profion meincnod

Yn lle defnyddio rhywfaint o set ddata a gynhyrchir gan beiriannau ar gyfer y prawf hwn, gwnaethom ddefnyddio'r data "Cynhyrchedd yn ôl Amser Gweithredwr a Adroddir gan Amser" rhwng 1987 a 2018. Gallwch gael mynediad at y data defnyddio ein sgript sydd ar gael yma.

Maint y gronfa ddata yw 85 GB, gan ddarparu un tabl o 109 o golofnau.

Ymholiadau Meincnodi

Dyma'r ymholiadau a ddefnyddiais i gymharu ClickHouse, clickhousedb_fdw a PostgreSQL.

Q#
Ymholiad Yn Cynnwys Agregau a Grŵp Gan

Q1
DEWIS DiwrnodOfWythnos, cyfrif(*) AS c O ontime LLE Blwyddyn >= 2000 A Blwyddyn <= GRŴP 2008 GAN Ddiwrnod O'r Wythnos GORCHYMYN GAN c DESC;

Q2
DEWIS DiwrnodOfWythnos, cyfrwch(*) AS c O ontime LLE Oedi Oedi>10 A Blwyddyn>= 2000 A Blwyddyn <= 2008 GRŴP FEL DiwrnodOfWythnos GORCHYMYN GAN c DESC;

Q3
DEWIS Tarddiad, cyfrif(*) UG c O onamser LLE Oedi Oedi>10 A Blwyddyn>= 2000 A Blwyddyn <= 2008 GRŴP YN ÔL GORCHYMYN Tarddiad GAN c CYFYNGIAD DESC 10;

Q4
SELECT Carrier, cyfrif () O onamser LLE Oedi Deli>10 A Blwyddyn = 2007 GRŴP TRWY ORCHYMYN Cludydd TRWY gyfrif() DESC;

Q5
SELECT a.Carrier, c, c2, c1000/c2 fel c3 O ( SELECT Carrier, cyfrif () AS c O ARamser LLE Oedi>10 A Blwyddyn=2007 GRŴP GAN Gludwr ) YMUNIAD FEWNOL ( DEWIS Cludwr, cyfrif (*) UG c2 O ARamser LLE Blwyddyn=2007 GRŴP GAN Gludiwr)b ar a.Carrier=b.Carrier ORDER GAN c3 DESC;

Q6
SELECT a.Carrier, c, c2, c1000/c2 fel c3 O ( SELECT Carrier, cyfrif () AS c O AR Amser LLE Oedi>10 A Blwyddyn >= 2000 A Blwyddyn <= 2008 GRŴP GAN cludwr) YMUNIAD MEWNOL ( DEWIS Cludwr, cyfrif(*) AS c2 O ARamser LLE Blwyddyn >= 2000 A Blwyddyn <= 2008 GRŴP GAN Cludydd ) b ar a.Carrier=b.Carrier GORCHYMYN GAN c3 DESC;

Q7
SELECT Carrier, cyf(DepDelay) * 1000 UG c3 O ontime LLE Blwyddyn >= 2000 A Blwyddyn <= 2008 GRWP GAN Carrier;

Q8
DEWIS Blwyddyn, cyf(Oedi Oedi) O GRŴP onamser FIS Blwyddyn;

Q9
dewis Blwyddyn, cyfrif(*) fel c1 o grŵp onamser fesul Blwyddyn;

Q10
DEWISWCH cyf(cnt) O (DEWIS Blwyddyn,Mis,cyfrif(*) UG cnt O ontime LLE DepDel15=1 GRŴP YN ÔL Blwyddyn,Mis) a;

Q11
dewiswch cyf(c1) o (dewiswch Flwyddyn,Mis,cyfrif(*) fel c1 o grŵp ontime fesul Blwyddyn,Mis) a;

Q12
DEWISWCH OriginCityName, DestCityName, cyfrif(*) UG c O GRŴP ontime GAN OriginCityName, DestCityName GORCHYMYN GAN c DESC TERFYN 10;

Q13
DEWISWCH OriginCityName, cyfrif(*) FEL C O'R GRŴP onamser GAN ORiginCityName GORCHYMYN GAN c TERFYN DESC 10;

Ymholiad Yn Cynnwys Ymuno

Q14
DEWISWCH Flwyddyn, c1/c2 GAN ( dewiswch Blwyddyn , cyfrif ()1000 fel c1 o aramser LLE Oedi Oedi>10 GRŴP FLYNYDDOL) YMUNIAD MEWNOL (dewiswch Flwyddyn, cyfrwch(*) fel c2 o ontime GRŴP YN ÔL Blwyddyn ) b ar a.Blwyddyn=b.Blwyddyn ORCHYMYN a.Blwyddyn;

Q15
DEWISWCH a.”Blwyddyn”, c1/c2 GAN (dewiswch “Blwyddyn”, cyfrif()1000 fel c1 O ffontime LLE “Oedi Oedi”>10 GRŴP ERBYN “Blwyddyn”) YMUNIAD MEWNOL (dewiswch “Blwyddyn”, cyfrif(*) fel c2 O GRŴP ffontime ERBYN “Blwyddyn”) b ar a.” Blwyddyn” = b. "Blwyddyn";

Tabl-1: Ymholiadau a ddefnyddir yn y meincnod

Ymholiad am ddienyddiadau

Dyma ganlyniadau pob un o'r ymholiadau wrth eu rhedeg mewn gwahanol leoliadau cronfa ddata: PostgreSQL gyda mynegeion a hebddynt, 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: Yr amser a gymerwyd i weithredu'r ymholiadau a ddefnyddiwyd yn y meincnod

Gweld canlyniadau

Mae'r graff yn dangos yr amser cyflawni ymholiad mewn milieiliadau, mae'r echelin X yn dangos rhif yr ymholiad o'r tablau uchod, ac mae'r echel Y yn dangos yr amser gweithredu mewn milieiliadau. Dangosir canlyniadau ClickHouse a data a gafwyd o postgres gan ddefnyddio clickhousedb_fdw. O'r tabl gallwch weld bod gwahaniaeth enfawr rhwng PostgreSQL a ClickHouse, ond ychydig iawn o wahaniaeth rhwng ClickHouse a clickhousedb_fdw.

Profi perfformiad ymholiadau dadansoddol yn PostgreSQL, ClickHouse a clickhousedb_fdw (PostgreSQL)

Mae'r graff hwn yn dangos y gwahaniaeth rhwng ClickhouseDB a clickhousedb_fdw. Yn y rhan fwyaf o ymholiadau, nid yw gorbenion FDW mor uchel â hynny a phrin ei fod yn arwyddocaol ac eithrio C12. Mae'r ymholiad hwn yn cynnwys uno a chymal GORCHYMYN GAN. Oherwydd y cymal GORCHYMYN GAN GRŴP / GAN, nid yw ORDER BY yn disgyn i ClickHouse.

Yn Nhabl 2 gwelwn y naid amser mewn ymholiadau C12 a C13. Eto, mae hyn yn cael ei achosi gan y cymal GORCHYMYN GAN. I gadarnhau hyn, rhedais ymholiadau Q-14 a Q-15 gyda'r cymal GORCHYMYN GAN a hebddo. Heb y cymal GORCHYMYN TRWY yr amser cwblhau yw 259ms a gyda'r cymal GORCHYMYN WRTH 1364212. I ddadfygio'r ymholiad hwn rwy'n egluro'r ddau ymholiad a dyma ganlyniadau'r esboniad.

C15: Heb Orchymyn GAN Gymal

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 Orchymyn GAN Gymal

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 GORCHYMYN GAN Gymal

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 GORCHYMYN GAN Gymal

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 da iawn, ac mae clickhousedb_fdw yn cynnig buddion perfformiad ClickHouse o PostgreSQL. Er bod rhywfaint o orbenion wrth ddefnyddio clickhousedb_fdw, mae'n ddibwys ac yn debyg i'r perfformiad a gyflawnwyd trwy redeg yn frodorol ar gronfa ddata ClickHouse. Mae hyn hefyd yn cadarnhau bod fdw yn PostgreSQL yn darparu canlyniadau rhagorol.

Sgwrs Telegram trwy Clickhouse https://t.me/clickhouse_ru
Sgwrs Telegram gan ddefnyddio PostgreSQL https://t.me/pgsql

Ffynhonnell: hab.com

Ychwanegu sylw