በPostgreSQL፣ ClickHouse እና clickhousedb_fdw (PostgreSQL) ውስጥ የትንታኔ መጠይቆችን አፈጻጸም በመሞከር ላይ።

በዚህ ጥናት፣ ከ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 ከፐርኮና የመጣ ክፍት ምንጭ ፕሮጀክት ነው። የፕሮጀክቱ የ GitHub ማከማቻ አገናኝ እዚህ አለ።.

በማርች ውስጥ ስለ 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 መካከል ያለው ልዩነት አነስተኛ መሆኑን ማየት ይችላሉ።

በPostgreSQL፣ ClickHouse እና clickhousedb_fdw (PostgreSQL) ውስጥ የትንታኔ መጠይቆችን አፈጻጸም በመሞከር ላይ።

ይህ ግራፍ በ 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 በኩል የቴሌግራም ውይይት https://t.me/clickhouse_ru
PostgreSQL በመጠቀም የቴሌግራም ውይይት https://t.me/pgsql

ምንጭ: hab.com

አስተያየት ያክሉ