ఈ అధ్యయనంలో, PostgreSQL కాకుండా ClickHouse డేటా సోర్స్ని ఉపయోగించడం ద్వారా ఎలాంటి పనితీరు మెరుగుదలలను సాధించవచ్చో చూడాలనుకున్నాను. ClickHouseని ఉపయోగించడం వల్ల నేను పొందే ఉత్పాదకత ప్రయోజనాలు నాకు తెలుసు. నేను ఫారిన్ డేటా ర్యాపర్ (FDW)ని ఉపయోగించి PostgreSQL నుండి ClickHouseని యాక్సెస్ చేస్తే ఈ ప్రయోజనాలు కొనసాగుతాయా?
అధ్యయనం చేసిన డేటాబేస్ పరిసరాలు PostgreSQL v11, clickhousedb_fdw మరియు ClickHouse డేటాబేస్. అంతిమంగా, PostgreSQL v11 నుండి మేము మా clickhousedb_fdw ద్వారా ClickHouse డేటాబేస్కు మళ్లించబడే వివిధ SQL ప్రశ్నలను అమలు చేస్తాము. స్థానిక PostgreSQL మరియు స్థానిక క్లిక్హౌస్లో నడుస్తున్న అదే ప్రశ్నలతో FDW పనితీరు ఎలా సరిపోతుందో మనం చూస్తాము.
క్లిక్హౌస్ డేటాబేస్
ClickHouse అనేది ఓపెన్ సోర్స్ కాలమ్ డేటాబేస్ మేనేజ్మెంట్ సిస్టమ్, ఇది సాంప్రదాయ డేటాబేస్ విధానాల కంటే 100-1000 రెట్లు వేగంగా పనితీరును సాధించగలదు, సెకను కంటే తక్కువ వ్యవధిలో బిలియన్ అడ్డు వరుసలను ప్రాసెస్ చేయగలదు.
Clickhousedb_fdw
clickhousedb_fdw - ClickHouse డేటాబేస్ లేదా FDW కోసం బాహ్య డేటా రేపర్ అనేది పెర్కోనా నుండి ఓపెన్ సోర్స్ ప్రాజెక్ట్.
మీరు చూసేటట్లుగా, ఇది ClickHouse కోసం FDWని అందిస్తుంది, ఇది PostgreSQL v11 సర్వర్ నుండి క్లిక్హౌస్ డేటాబేస్ నుండి SELECT చేయడానికి మరియు ఇన్సర్ట్ చేయడానికి అనుమతిస్తుంది.
FDW సమగ్ర మరియు చేరడం వంటి అధునాతన ఫీచర్లకు మద్దతు ఇస్తుంది. ఈ రిసోర్స్-ఇంటెన్సివ్ ఆపరేషన్ల కోసం రిమోట్ సర్వర్ యొక్క వనరులను ఉపయోగించడం ద్వారా ఇది పనితీరును గణనీయంగా మెరుగుపరుస్తుంది.
బెంచ్మార్క్ పర్యావరణం
- సూపర్మైక్రో సర్వర్:
- Intel® Xeon® CPU E5-2683 v3 @ 2.00GHz
- 2 సాకెట్లు / 28 కోర్లు / 56 థ్రెడ్లు
- మెమరీ: 256GB RAM
- నిల్వ: Samsung SM863 1.9TB Enterprise SSD
- ఫైల్ సిస్టమ్: ext4/xfs
- OS: Linux smblade01 4.15.0-42-generic #45~16.04.1-Ubuntu
- PostgreSQL: వెర్షన్ 11
బెంచ్మార్క్ పరీక్షలు
ఈ పరీక్ష కోసం కొంత మెషిన్-జెనరేటెడ్ డేటా సెట్ని ఉపయోగించే బదులు, మేము 1987 నుండి 2018 వరకు "సమయం నివేదించిన ఆపరేటర్ సమయం ద్వారా ఉత్పాదకత" డేటాను ఉపయోగించాము. మీరు డేటాను యాక్సెస్ చేయవచ్చు
డేటాబేస్ పరిమాణం 85 GB, ఇది 109 నిలువు వరుసల పట్టికను అందిస్తుంది.
బెంచ్మార్క్ ప్రశ్నలు
ClickHouse, clickhousedb_fdw మరియు PostgreSQLని పోల్చడానికి నేను ఉపయోగించిన ప్రశ్నలు ఇక్కడ ఉన్నాయి.
Q#
ప్రశ్న సమూహాలను మరియు సమూహాన్ని కలిగి ఉంటుంది
Q1
డేఆఫ్వీక్ని ఎంచుకోండి, సి డెస్క్ ద్వారా డేఆఫ్వీక్ ఆర్డర్ ప్రకారం సంవత్సరం >= 2000 మరియు సంవత్సరం <= 2008 గ్రూప్ ఆన్టైమ్ నుండి సి కౌంట్(*);
Q2
డేఆఫ్వీక్ని ఎంచుకోండి, డిప్డిలే>10 మరియు సంవత్సరం >= 2000 మరియు సంవత్సరం <= 2008 గ్రూప్ ఆఫ్ డేఆఫ్వీక్ ఆర్డర్ ద్వారా సి డెస్క్ ద్వారా ఆన్టైమ్ నుండి సి కౌంట్(*);
Q3
మూలాన్ని ఎంచుకోండి, డిప్డిలే>10 మరియు సంవత్సరం >= 2000 మరియు సంవత్సరం <= 2008 గ్రూప్ ఆఫ్ ఆన్టైమ్ నుండి సి డెస్క్ పరిమితి 10 ద్వారా ఆర్డర్ చేయండి;
Q4
క్యారియర్ని ఎంచుకోండి, కౌంట్() ఆన్టైమ్ నుండి ఎక్కడ DepDelay>10 మరియు సంవత్సరం = 2007 గ్రూప్ ద్వారా క్యారియర్ ఆర్డర్ ద్వారా గణన() DESC;
Q5
ఎంపిక a.క్యారియర్, c, c2, c1000/c2 c3 నుండి (క్యారియర్ని ఎంచుకోండి, కౌంట్() AS c ఆన్టైమ్ నుండి ఎక్కడ డిప్డిలే>10 మరియు సంవత్సరం=2007 గ్రూప్ ద్వారా క్యారియర్ ) ఒక అంతర్గత చేరిక (క్యారియర్ను ఎంపిక చేసుకోండి, కౌంట్(*) AS c2 ఆన్టైమ్ నుండి ఎక్కడ సంవత్సరం=2007 క్యారియర్ ద్వారా గ్రూప్)b on a.Carrier=b.Carrier Order ద్వారా c3 DESC;
Q6
ఎంపిక a.క్యారియర్, c, c2, c1000/c2 c3 నుండి (క్యారియర్ని ఎంచుకోండి, కౌంట్() AS c ఆన్టైమ్ నుండి ఎక్కడ డిప్డెలే>10 మరియు సంవత్సరం >= 2000 మరియు సంవత్సరం <= 2008 గ్రూప్ బై క్యారియర్) ఒక అంతర్గత చేరిక (క్యారియర్ను ఎంచుకోండి, కౌంట్(*) c2గా ఉన్న సమయం నుండి ఎక్కడ సంవత్సరం >= 2000 మరియు సంవత్సరం <= 2008 క్యారియర్ ) b ఆన్ a.Carrier=b.c3 DESC ద్వారా క్యారియర్ ఆర్డర్;
Q7
క్యారియర్ని ఎంపిక చేసుకోండి, సగటు(డిప్డే) * 1000 AS c3 ఆన్టైమ్ నుండి ఎక్కడ సంవత్సరం >= 2000 మరియు సంవత్సరం <= 2008 క్యారియర్ ద్వారా గ్రూప్;
Q8
ఆన్టైమ్ గ్రూప్ నుండి సంవత్సరాన్ని, సగటు (డిప్డేలే) ఎంచుకోండి;
Q9
సంవత్సరాన్ని ఎన్నుకోండి, సంవత్సరం వారీగా ఆన్టైమ్ సమూహం నుండి (*) c1గా లెక్కించండి;
Q10
సగటు(cnt) నుండి ఎంచుకోండి (సంవత్సరం, నెల, గణన(*) నుండి cnt వంటి సమయానికి ఎంచుకోండి ఎక్కడ DepDel15=1 సమూహం సంవత్సరం,నెల) a;
Q11
నుండి avg(c1)ని ఎంచుకోండి (సంవత్సరం,నెల,సంవత్సరం,నెలవారీగా ఆన్టైమ్ గ్రూప్ నుండి c1గా సంవత్సరం,నెల,గణన(*) ఎంచుకోండి) a;
Q12
OriginCityName, DestCityName, కౌంట్(*)ని ఆన్టైమ్ గ్రూప్ నుండి OriginCityName, DestCityName ఆర్డర్ ద్వారా c DESC పరిమితి 10;
Q13
OriginCityNameని ఎంచుకోండి, c డెస్క్ పరిమితి 10 ద్వారా OriginCityName ఆర్డర్ ఆన్టైమ్ గ్రూప్ నుండి c కౌంట్(*);
ప్రశ్న చేరికలను కలిగి ఉంటుంది
Q14
a.Year, c1/c2 నుండి ఎంచుకోండి ( సంవత్సరం ఎంచుకోండి, కౌంట్()1000 ఆన్టైమ్ ఎక్కడ డిప్డెలే>సంవత్సరానికి 1 గ్రూప్) ఒక అంతర్గత చేరిక (సంవత్సరాన్ని ఎంచుకోండి, సంవత్సరానికి సంబంధించి ఆన్టైమ్ గ్రూప్ నుండి c10గా (*) లెక్కించండి) b న a.Year=b.సంవత్సరానికి ఆర్డర్;
Q15
ఒక”సంవత్సరం”, c1/c2 నుండి ఎంచుకోండి (“సంవత్సరం” ఎంచుకోండి, కౌంట్()1000 ఫాన్టైమ్ నుండి c1గా “డిప్డేలే”> “సంవత్సరం” ద్వారా 10 సమూహం) ఒక అంతర్గత చేరిక (“సంవత్సరం” ఎంచుకోండి, గణన(*) నుండి c2గా ఫాన్టైమ్ గ్రూప్ నుండి “సంవత్సరం” ) b న a.”Year”=b. "సంవత్సరం";
టేబుల్-1: బెంచ్మార్క్లో ఉపయోగించిన ప్రశ్నలు
విచారణ అమలు
విభిన్న డేటాబేస్ సెట్టింగ్లలో అమలు చేసినప్పుడు ప్రతి ప్రశ్నల ఫలితాలు ఇక్కడ ఉన్నాయి: PostgreSQL సూచికలతో మరియు లేకుండా, స్థానిక ClickHouse మరియు clickhousedb_fdw. సమయం మిల్లీసెకన్లలో చూపబడుతుంది.
Q#
PostgreSQL
PostgreSQL (ఇండెక్స్ చేయబడింది)
క్లిక్హౌస్
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: బెంచ్మార్క్లో ఉపయోగించిన ప్రశ్నలను అమలు చేయడానికి పట్టే సమయం
ఫలితాలను వీక్షించండి
గ్రాఫ్ ప్రశ్న అమలు సమయాన్ని మిల్లీసెకన్లలో చూపుతుంది, X అక్షం పై పట్టికల నుండి ప్రశ్న సంఖ్యను చూపుతుంది మరియు Y అక్షం అమలు సమయాన్ని మిల్లీసెకన్లలో చూపుతుంది. Clickhousedb_fdwని ఉపయోగించి postgres నుండి పొందబడిన ClickHouse ఫలితాలు మరియు డేటా చూపబడ్డాయి. పట్టిక నుండి మీరు PostgreSQL మరియు ClickHouse మధ్య భారీ వ్యత్యాసం ఉన్నట్లు చూడవచ్చు, కానీ ClickHouse మరియు clickhousedb_fdw మధ్య తక్కువ వ్యత్యాసం ఉంది.
ఈ గ్రాఫ్ ClickhouseDB మరియు clickhousedb_fdw మధ్య వ్యత్యాసాన్ని చూపుతుంది. చాలా ప్రశ్నలలో, FDW ఓవర్హెడ్ అంత ఎక్కువగా లేదు మరియు Q12 మినహా చాలా ముఖ్యమైనది కాదు. ఈ ప్రశ్నలో చేరికలు మరియు నిబంధన వారీగా ఆర్డర్ ఉన్నాయి. GROUP/BY క్లాజ్ ద్వారా ఆర్డర్ కారణంగా, ఆర్డర్ ద్వారా ఆర్డర్ క్లిక్హౌస్కి డ్రాప్ డౌన్ కాదు.
టేబుల్ 2లో Q12 మరియు Q13 ప్రశ్నలలో టైమ్ జంప్ని చూస్తాము. మళ్ళీ, ఇది ఆర్డర్ బై క్లాజ్ ద్వారా ఏర్పడింది. దీన్ని నిర్ధారించడానికి, నేను ప్రశ్నలను Q-14 మరియు Q-15తో మరియు నిబంధన ద్వారా ఆర్డర్ లేకుండా అమలు చేసాను. నిబంధన ద్వారా ఆర్డర్ లేకుండా పూర్తి సమయం 259ms మరియు నిబంధన ద్వారా ఆర్డర్ 1364212. ఈ ప్రశ్నను డీబగ్ చేయడానికి నేను రెండు ప్రశ్నలను వివరిస్తున్నాను మరియు వివరణ యొక్క ఫలితాలు ఇక్కడ ఉన్నాయి.
Q15: నిబంధన ప్రకారం ఆర్డర్ లేకుండా
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: క్లాజ్ ద్వారా ఆర్డర్ లేకుండా ప్రశ్న
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: క్లాజ్ ద్వారా ఆర్డర్తో ప్రశ్న
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: క్లాజ్ ద్వారా ఆర్డర్తో ప్రశ్న ప్రణాళిక
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)
తీర్మానం
ఈ ప్రయోగాల ఫలితాలు ClickHouse నిజంగా మంచి పనితీరును అందిస్తుందని మరియు clickhousedb_fdw PostgreSQL నుండి ClickHouse పనితీరు ప్రయోజనాలను అందజేస్తుందని చూపిస్తుంది. clickhousedb_fdwని ఉపయోగిస్తున్నప్పుడు కొంత ఓవర్హెడ్ ఉన్నప్పటికీ, ఇది క్లిక్హౌస్ డేటాబేస్లో స్థానికంగా అమలు చేయడం ద్వారా సాధించిన పనితీరుతో పోల్చదగినది కాదు. PostgreSQLలోని fdw అద్భుతమైన ఫలితాలను అందిస్తుందని కూడా ఇది నిర్ధారిస్తుంది.
Clickhouse ద్వారా టెలిగ్రామ్ చాట్
PostgreSQL ఉపయోగించి టెలిగ్రామ్ చాట్
మూలం: www.habr.com