A’ dèanamh deuchainn air coileanadh cheistean anailis ann am PostgreSQL, ClickHouse agus clickhousedb_fdw (PostgreSQL)

Anns an sgrùdadh seo, bha mi airson faicinn dè na leasachaidhean coileanaidh a ghabhadh a choileanadh le bhith a’ cleachdadh stòr dàta ClickHouse seach PostgreSQL. Tha fios agam air na buannachdan cinneasachd a gheibh mi bho bhith a’ cleachdadh ClickHouse. An lean na buannachdan sin ma gheibh mi cothrom air ClickHouse bho PostgreSQL a’ cleachdadh Clò-bhualadh Dàta Cèin (FDW)?

Is e na h-àrainneachdan stòr-dàta a chaidh a sgrùdadh PostgreSQL v11, clickhousedb_fdw agus stòr-dàta ClickHouse. Aig a’ cheann thall, bho PostgreSQL v11 bidh sinn a’ ruith diofar cheistean SQL air an stiùireadh tron ​​clickhousedb_fdw againn gu stòr-dàta ClickHouse. Chì sinn an uairsin mar a tha coileanadh FDW an coimeas ris na h-aon cheistean a tha a’ ruith ann am PostgreSQL dùthchasach agus ClickHouse dùthchasach.

Stòr-dàta Clickhouse

Tha ClickHouse na shiostam riaghlaidh stòr-dàta colbh stòr fosgailte as urrainn coileanadh a choileanadh 100-1000 uair nas luaithe na dòighean stòr-dàta traidiseanta, comasach air còrr air billean sreath a ghiullachd ann an nas lugha na diog.

Cliog taigh-db_fdw

clickhousedb_fdw - Tha am pasgan dàta taobh a-muigh airson stòr-dàta ClickHouse, no FDW, na phròiseact le còd fosgailte bho Percona. Seo ceangal gu stòr GitHub a’ phròiseict.

Anns a 'Mhàrt sgrìobh mi blog a dh'innseas barrachd dhut mun FDW againn.

Mar a chì thu, tha seo a’ toirt seachad FDW airson ClickHouse a leigeas le SELECT bho, agus INSERT INTO, stòr-dàta ClickHouse bhon t-seirbheisiche PostgreSQL v11.

Bidh FDW a’ toirt taic do fheartan adhartach leithid cruinneachadh agus join. Bidh seo a’ leasachadh coileanadh gu mòr le bhith a’ cleachdadh goireasan an fhrithealaiche iomallach airson na h-obraichean sin a tha dian air stòras.

Àrainneachd comharraichte

  • Frithealaiche Supermicro:
    • Intel® Xeon® CPU E5-2683 v3 @ 2.00GHz
    • 2 socaid / 28 cores / 56 snàithlean
    • Cuimhne: 256GB de RAM
    • Stòradh: Samsung SM863 1.9TB Enterprise SSD
    • Siostam faidhle: ext4 / xfs
  • OS: Linux sblade01 4.15.0-42-generic #45~16.04.1-Ubuntu
  • PostgreSQL: dreach 11

Deuchainnean comharrachaidh

An àite a bhith a’ cleachdadh cuid de sheata dàta a chaidh a ghineadh le inneal airson an deuchainn seo, chleachd sinn an dàta “Productivity by Time Reported Operator Time” bho 1987 gu 2018. Gheibh thu cothrom air an dàta a’ cleachdadh an sgriobt againn a tha ri fhaighinn an seo.

Is e meud an stòr-dàta 85 GB, a’ toirt seachad aon chlàr de 109 colbhan.

Ceistean Slat-tomhais

Seo na ceistean a chleachd mi airson coimeas a dhèanamh eadar ClickHouse, clickhousedb_fdw agus PostgreSQL.

Q#
Anns a’ cheist tha Cruinneachaidhean agus Buidheann Le

Q1
SELECT DayOfWeek, cunnt(*) AS c BHO ontime CHAN EIL Bliadhna >= 2000 AGUS A 'Bhliadhna <= GRÙPA 2008 A RÈIR Latha Latha na Seachdain Òrdugh LE c DESC;

Q2
ROGHNACH Latha na Seachdain, cunnt(*) AS c BHO àm san àm a dh'aona-ghnothach Far an Dìoladh>10 's a' Bhliadhna>= 2000 AGUS A' Bhliadhna <= 2008 GRÙPA A BHITH A' BHLIADHNA AIRSON Latha na Seachdain Òrdugh LE c DESC;

Q3
ROGHA Tùs, cunnt(*) AS c Àn-àm LÀITE Ìomhaigh>10 AGUS Bliadhna >= 2000 IS Bliadhna <= 2008 GRÙPA A rèir Tùs Òrdugh A rèir c DESC LIMIT 10;

Q4
SELECT Carrier, cunntadh () Bhon àm a dh’ fhalbh LÀRACH DÙTHCHAS> 10 AGUS Bliadhna = Buidheann 2007 A-rèir neach-giùlain Òrdugh A rèir cunntais () DESC;

Q5
SELECT a.Carrier, c, c2, c1000/c2 mar c3 BHO ( SELECT Carrier, cunnt () AS c bho àm-ama FÀILTE DÙTHCHAS> 10 AGUS Bliadhna = Buidheann 2007 le neach-giùlain ) ballrachd a-staigh (SELECT Carrier, cunnt (*) AS c2 FROM ontime CHAN EIL Bliadhna = 2007 GRWP BY neach-giùlain)b air a.Carrier=b.Carrier ORDER LE c3 DESC;

Q6
SELECT a.Carrier, c, c2, c1000/c2 mar c3 BHO ( SELECT Carrier, cunnt () AS c Bhon àm a-staigh far a bheil Dìoladh>10 AGUS Bliadhna>= 2000 AGUS Bliadhna <= GRÚPA 2008 le neach-giùlain) ballrachd a-staigh (Tagh Neach-giùlain, cunnt(*) AS c2 Bhon àm a-staigh far a bheil Bliadhna >= 2000 AGUS Bliadhna <= 2008 GRÙPA A CHEANN Carrier ) b air a.Carrier=b.Carrier ORDER LE c3 DESC;

Q7
SELECT Carrier, avg (DepDelay) * 1000 AS c3 Bhon àm a-muigh WHERE Bliadhna >= 2000 AGUS Bliadhna <= 2008 GRÙPA BY neach-giùlain;

Q8
SELECT Year, avg (DelayDelay) BHO GRÙPA air-ùine A RINNEADH Bliadhna;

Q9
tagh Bliadhna, cunnt (*) mar c1 bho bhuidheann air-ùine a rèir Bliadhna;

Q10
SELECT avg(cnt) BHO (SELECT BLIADHNA,Mìos,cunnt(*) AS cnt BHO ontime CHAN EIL DepDel15=1 GRÙPA A rèir Bliadhna,Mìos) a;

Q11
tagh avg (c1) bho (tagh Bliadhna, Mìos, cunnt (*) mar c1 bho bhuidheann ontime a rèir Bliadhna, Mìos) a;

Q12
SELECT OriginCityName, DestCityName, cunnt(*) AS c BHO GROUP ontime LE TùsCityName, DestCityName ORDER LE c DESC LIMIT 10;

Q13
SELECT OriginCityName, cunnt(*) AS c BHON GRÚPA ontime LE TùsCityName Òrdugh A rèir c DESC LIMIT 10;

Ceist anns a bheil Joins

Q14
SELECT a.Year, c1/c2 BHO (tagh Bliadhna, cunnt ()1000 mar c1 bho àm gu àm LÀITE DÙTHCHAS> 10 GRÙPA AN T-SAOGHAL) JOIN A-MHÀIN (tagh Bliadhna, cunnt(*) mar c2 bho àm gu àm GRÙPA A rèir Bliadhna ) b air a.Bliadhna = b.Bliadhna Òrdugh A rèir bliadhna;

Q15
SELECT a.” Bliadhna”, c1/c2 BHO (tagh “Bliadhna”, cunnt ()1000 mar c1 BHO fontime CHAN EIL “DepDelay”> 10 GRWP ro “Bliadhna”) JOIN A-MHÀIN (tagh “Bliadhna”, cunnt (*) mar c2 BHO CHRÒPA fontime ro “Bliadhna”) b air a.” Bliadhna ”= b. "Bliadhna";

Clàr-1: Ceistean air an cleachdadh ann an slat-tomhais

Cuir gu bàs ceist

Seo toraidhean gach ceist nuair a thèid an ruith ann an diofar shuidheachaidhean stòr-dàta: PostgreSQL le agus às aonais clàran-amais, ClickHouse dùthchasach agus clickhousedb_fdw. Tha ùine air a nochdadh ann am milliseconds.

Q#
PostgreSQL
PostgreSQL (clàraichte)
Cliog Taigh
cliog taighdb_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

Clàr-1: An ùine a chaidh a ghabhail gus na ceistean a chaidh a chleachdadh ann an slat-tomhais a chuir an gnìomh

Seall na toraidhean

Tha an graf a’ sealltainn ùine cur an gnìomh na ceiste ann am milliseconds, tha an axis X a’ sealltainn àireamh na ceiste bho na clàran gu h-àrd, agus tha an axis Y a’ sealltainn an ùine cur gu bàs ann am milliseconds. Tha toraidhean ClickHouse agus dàta a chaidh fhaighinn air ais bho postgres a’ cleachdadh clickhousedb_fdw air an sealltainn. Bhon chlàr chì thu gu bheil eadar-dhealachadh mòr eadar PostgreSQL agus ClickHouse, ach glè bheag de eadar-dhealachadh eadar ClickHouse agus clickhousedb_fdw.

A’ dèanamh deuchainn air coileanadh cheistean anailis ann am PostgreSQL, ClickHouse agus clickhousedb_fdw (PostgreSQL)

Tha an graf seo a’ sealltainn an eadar-dhealachaidh eadar ClickhouseDB agus clickhousedb_fdw. Anns a’ mhòr-chuid de cheistean, chan eil an os-cionn FDW cho àrd agus cha mhòr gu bheil e cudromach ach a-mhàin Q12. Tha a’ cheist seo a’ toirt a-steach ceanglaichean agus clàs ORDER BY. Air sgàth clàs ORDER BY GROUP/BY, cha bhith ORDER BY a’ tuiteam sìos gu ClickHouse.

Ann an Clàr 2 chì sinn an leum ùine ann an ceistean Q12 agus Q13. A-rithist, tha seo air adhbhrachadh le clàs ORDER BY. Gus seo a dhearbhadh, ruith mi ceistean Q-14 agus Q-15 le agus às aonais clàs ORDER BY. Às aonais clàs ORDER BY tha an ùine crìochnachaidh 259ms agus leis a’ chlàs ORDER BY ’s e 1364212 a th’ ann. Airson a’ cheist seo a dheasbad tha mi a’ mìneachadh an dà chuid na ceistean agus seo toraidhean a’ mhìneachaidh.

Q15: Gun ORDER BY Clàs

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: Ceist Às aonais ORDER A rèir Clàs

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)

Q14: Ceist Le ORDER A-rèir Clàs

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: Ceist Plana le ORDER BY Clàs

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)

co-dhùnadh

Tha toraidhean nan deuchainnean sin a’ sealltainn gu bheil ClickHouse a’ tabhann coileanadh fìor mhath, agus tha clickhousedb_fdw a’ tabhann buannachdan coileanaidh ClickHouse bho PostgreSQL. Ged a tha beagan os cionn ann nuair a bhios tu a’ cleachdadh clickhousedb_fdw, tha e glè bheag agus an coimeas ris a’ choileanadh a chaidh a choileanadh le bhith a’ ruith gu dùthchasach air stòr-dàta ClickHouse. Tha seo cuideachd a’ dearbhadh gu bheil fdw ann am PostgreSQL a’ toirt seachad toraidhean sàr-mhath.

Telegram cabadaich tro Clickhouse https://t.me/clickhouse_ru
Còmhradh teileagram a’ cleachdadh PostgreSQL https://t.me/pgsql

Source: www.habr.com

Cuir beachd ann