በዚህ ጥናት፣ ከPostgreSQL ይልቅ የ ClickHouse መረጃ ምንጭን በመጠቀም ምን አይነት የአፈጻጸም ማሻሻያዎችን ማግኘት እንደሚቻል ለማየት ፈልጌ ነበር። ClickHouseን በመጠቀም የማገኛቸውን የምርታማነት ጥቅሞች አውቃለሁ። የውጭ ዳታ መጠቅለያ (FDW) ተጠቅሜ ClickHouseን ከ PostgreSQL ካገኘሁ እነዚህ ጥቅሞች ይቀጥላሉ?
የተጠኑ የመረጃ ቋት አካባቢዎች PostgreSQL v11፣ clickhousedb_fdw እና ClickHouse ዳታቤዝ ናቸው። በመጨረሻ፣ ከPostgreSQL v11 ጀምሮ በእኛ clickhousedb_fdw ወደ ClickHouse ዳታቤዝ የሚደረጉ የተለያዩ የSQL መጠይቆችን እናስኬዳለን። የFDW አፈጻጸም በቤተኛ PostgreSQL እና ቤተኛ ClickHouse ውስጥ ከሚሰሩ ተመሳሳይ መጠይቆች ጋር እንዴት እንደሚወዳደር እንመለከታለን።
Clickhouse የውሂብ ጎታ
ClickHouse ከባህላዊ የውሂብ ጎታ አቀራረቦች ከ100-1000 ጊዜ ፈጣን አፈጻጸምን ማሳካት የሚችል፣ ከአንድ ቢሊዮን በላይ ረድፎችን በሰከንድ ባነሰ ጊዜ ውስጥ ማካሄድ የሚችል ክፍት ምንጭ የአምድ ዳታቤዝ አስተዳደር ስርዓት ነው።
Clickhousedb_fdw
clickhousedb_fdw - የ ClickHouse ዳታቤዝ ውጫዊ ዳታ መጠቅለያ ወይም FDW ከፐርኮና የመጣ ክፍት ምንጭ ፕሮጀክት ነው።
እንደምታየው፣ ይህ ከPostgreSQL v11 አገልጋይ ከ SELECT ን እና INSERT INTO ከ ClickHouse ዳታቤዝ የሚፈቅድ FDW ይሰጣል።
FDW እንደ ድምር እና መቀላቀል ያሉ የላቁ ባህሪያትን ይደግፋል። ይህ የርቀት አገልጋዩን ሃብት ለእነዚህ ሃብት-ተኮር ስራዎች በመጠቀም አፈጻጸምን በእጅጉ ያሻሽላል።
የቤንችማርክ አካባቢ
- ሱፐርማይክሮ አገልጋይ፡
- Intel® Xeon® ሲፒዩ E5-2683 v3 @ 2.00GHz
- 2 ሶኬቶች / 28 ኮር / 56 ክሮች
- ማህደረ ትውስታ: 256 ጊባ ራም
- ማከማቻ፡ ሳምሰንግ SM863 1.9ቲቢ ኢንተርፕራይዝ ኤስኤስዲ
- የፋይል ስርዓት፡ ext4/xfs
- ስርዓተ ክወና፡ Linux smblade01 4.15.0-42-generic #45~16.04.1-Ubuntu
- PostgreSQL፡ ስሪት 11
የቤንችማርክ ሙከራዎች
ለዚህ ሙከራ አንዳንድ በማሽን የመነጨ የውሂብ ስብስብ ከመጠቀም ይልቅ ከ1987 እስከ 2018 ያለውን "ምርታማነት በ Time Reported Operator Time" መረጃን ተጠቅመንበታል። ውሂቡን መድረስ ይችላሉ።
የመረጃ ቋቱ መጠን 85 ጂቢ ሲሆን አንድ የ 109 አምዶች ሠንጠረዥ ያቀርባል.
የቤንችማርክ መጠይቆች
ClickHouseን፣ clickhousedb_fdw እና PostgreSQLን ለማነጻጸር የተጠቀምኳቸው ጥያቄዎች እዚህ አሉ።
Q#
መጠይቁ ድምርን እና ቡድንን ይይዛል
Q1
የሳምንት ቀንን ይምረጡ፣(*) ከግዜ ጀምሮ ይቆጥሩ የት አመት >= 2000 እና አመት <= 2008 ቡድን በ DayOfWeek ትእዛዝ በ c DESC;
Q2
የሳምንቱን ቀን ምረጥ፣ ቆጠራ(*) ከግዜ ጀምሮ የት DepDelay>10 እና ዓመት >= 2000 እና አመት <= 2008 ቡድን በቀንOf ሳምንት ትእዛዝ በ c DESC;
Q3
መነሻን ምረጥ፣ መቁጠር(*) እንደ ሐ ከሰዓቱ የት DepDelay>10 እና ዓመት >= 2000 እና አመት <= 2008 ቡድን በመነሻ ትእዛዝ በ c DESC LIMIT 10;
Q4
ድምጸ ተያያዥ ሞደም ምረጥ፣ ቆጠራ()ከጊዜ ጀምሮ ከየት DepDelay>10 እና ዓመት = 2007 ቡድን በአገልግሎት አቅራቢ ትዕዛዝ በቁጥር()) DESC;
Q5
አ.አጓጓዥ፣ c፣ c2፣ c ይምረጡ1000/c2 እንደ c3 FROM (አገልግሎት አቅራቢን ይምረጡ፣ ቆጠራ() እንደ ሐ ከ ሰዓት ጀምሮ የት DepDelay>10 እና ዓመት=2007 ቡድን በአገልግሎት አቅራቢ) የውስጥ መቀላቀል (ድምጸ ተያያዥ ሞደም ምረጥ፣ቁጥር(*) እንደ c2 በጊዜው ከየት ዓመት=2007 በአገልግሎት አቅራቢ ቡድን) b በ a. Carrier=b.ድምጸ ተያያዥ ሞደም በ c3 DESC;
Q6
አ.አጓጓዥ፣ c፣ c2፣ c ይምረጡ1000/c2 እንደ c3 FROM (አገልግሎት አቅራቢን ይምረጡ፣ ቆጠራ() እንደ ሐ ከ ሰዓት ጀምሮ የት DepDelay> 10 እና ዓመት > = 2000 እና ዓመት <= 2008 በአገልግሎት አቅራቢ ቡድን) የውስጥ መቀላቀል (ድምጸ ተያያዥ ሞደም ምረጥ፣ ቆጠራ(*) እንደ c2 ከሰዓቱ የት ዓመት >= 2000 እና ዓመት <= 2008 ቡድን በ ተሸካሚ) b በ a.አጓጓዥ=b.አጓጓዥ ትእዛዝ በ c3 DESC;
Q7
አገልግሎት አቅራቢን ይምረጡ፣ አማካይ (DepDelay) * 1000 AS c3 ከሰዓቱ የት አመት >= 2000 እና ዓመት <= 2008 በአገልግሎት አቅራቢ ቡድን;
Q8
ዓመት ምረጥ፣ አማካኝ(DepDelay) በጊዜው ከቡድን በዓመት፤
Q9
ዓመትን ይምረጡ፣(*) ከጊዜ ቡድን በዓመት እንደ c1 ይቁጠሩ።
Q10
አማካይ(cnt) ከ(ዓመት፣ወር፣መቁጠር(*) ምረጥ ከሰአት ሰዓት ጀምሮ DepDel15=1 GROUP በዓመት፣ወር) a;
Q11
አማካኝ(c1) ከ (ዓመት፣ወር፣መቁጠር(*) ምረጥ ከጊዜ ቡድን በዓመት፣ወር) a;
Q12
OriginCity Nameን፣ DestCityNameን፣ ቆጠራን (*) እንደ ሐ ከቅጽበታዊ ቡድን በ OriginCityName፣ DestCityName ትእዛዝ በ DESC LIMIT 10;
Q13
የOriginCity ስም ምረጥ፣ ቆጠራ(*) እንደ ሐ ከቅጽበታዊ ቡድን በ OriginCity ስም ትእዛዝ በ c DESC LIMIT 10;
መጠይቅ መቀላቀልን ይዟል
Q14
ዓ.ም ይምረጡ፣ c1/c2 ከ (አመት ይምረጡ፣ ቆጠራ()1000 እንደ c1 ከሰአት ጀምሮ የት DepDelay>10 GROUP በዓመት) የውስጥ መቀላቀል (ዓመት፣ መቁጠር(*) ከጊዚያዊ ቡድን በዓመት እንደ c2 ምረጥ) b በዓመት=b.ዓመት ትዕዛዝ
Q15
ዓመት ምረጥ”፣ c1/c2 ከ (“ዓመት”ን ምረጥ፣ ቆጠራ()1000 እንደ c1 ከቅርጸ ቁምፊ የት “DepDelay”>10 ቡድን በ “ዓመት”) የውስጥ መቀላቀል (“ዓመት”ን ምረጥ፣ ቆጠራ (*) እንደ c2 ከፎንቲም ቡድን በ “ዓመት”) b on 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 ዘንግ የማስፈጸሚያ ጊዜን በሚሊሰከንዶች ያሳያል። ClickHouse ውጤቶች እና clickhousedb_fdw በመጠቀም ከፖስትግሬስ የተገኙ መረጃዎች ይታያሉ። ከሠንጠረዡ ላይ በ PostgreSQL እና ClickHouse መካከል ትልቅ ልዩነት እንዳለ፣ ነገር ግን በ ClickHouse እና clickhousedb_fdw መካከል ያለው ልዩነት አነስተኛ መሆኑን ማየት ይችላሉ።
ይህ ግራፍ በ ClickhouseDB እና clickhousedb_fdw መካከል ያለውን ልዩነት ያሳያል። በአብዛኛዎቹ መጠይቆች፣ የኤፍዲደብሊው ወጪ ያን ያህል ከፍ ያለ አይደለም እና ከQ12 በስተቀር ብዙም ጠቃሚ አይደለም። ይህ መጠይቅ መቀላቀልን እና ORDER BY አንቀጽን ያካትታል። በ ORDER BY GROUP/BY አንቀፅ ምክንያት፣ ORDER BY ወደ ClickHouse አይወርድም።
በሰንጠረዥ 2 ላይ የሰዓት ዝላይን በጥያቄዎች Q12 እና Q13 እናያለን። እንደገና፣ ይህ በ ORDER BY አንቀጽ ነው። ይህንን ለማረጋገጥ፣ መጠይቆችን Q-14 እና Q-15ን ከ ORDER BY አንቀጽ ጋር እና ያለ ሮጣሁ። ያለ ORDER BY አንቀጽ የማጠናቀቂያ ጊዜ 259ms እና በ ORDER BY አንቀጽ 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 የ ClickHouse አፈጻጸምን ከPostgreSQL ያቀርባል። clickhousedb_fdwን ሲጠቀሙ የተወሰነ ክፍያ ቢኖርም፣ በክሊክሃውስ ዳታቤዝ ላይ ተወላጅ ሆኖ በመሮጥ ከተገኘው አፈጻጸም ጋር ሊወዳደር የማይችል ነው። ይህ በ PostgreSQL ውስጥ fdw ጥሩ ውጤቶችን እንደሚያቀርብ ያረጋግጣል።
በ Clickhouse በኩል የቴሌግራም ውይይት
PostgreSQL በመጠቀም የቴሌግራም ውይይት
ምንጭ: hab.com