የ PostgreSQL መጠይቅ ዕቅዶችን ይበልጥ በተመቻቸ ሁኔታ መረዳት

ከግማሽ ዓመት በፊት አቅርበናል። አብራራ.tensor.ru - የህዝብ የጥያቄ ዕቅዶችን ለመተንተን እና ለመመልከት አገልግሎት ወደ PostgreSQL

የ PostgreSQL መጠይቅ ዕቅዶችን ይበልጥ በተመቻቸ ሁኔታ መረዳት

ባለፉት ወራት ስለ እሱ ሠርተናል በPGConf.Russia 2020 ላይ ሪፖርት አድርግ, ማጠቃለያ አዘጋጅቷል የ SQL መጠይቆችን ስለማፋጠን መጣጥፍ በሚሰጡት ምክሮች መሰረት... ነገር ግን ከሁሉም በላይ፣ የእርስዎን ግብረመልስ ሰብስበን እውነተኛ የአጠቃቀም ጉዳዮችን ተመልክተናል።

እና አሁን ሊጠቀሙባቸው ስለሚችሉ አዳዲስ እድሎች ለመነጋገር ዝግጁ ነን.

ለተለያዩ የእቅድ ቅርጸቶች ድጋፍ

ከጥያቄው ጋር ከምዝግብ ማስታወሻው ያቅዱ

በቀጥታ ከኮንሶል, ከመስመሩ ጀምሮ ሙሉውን እገዳ ይምረጡ የጥያቄ ጽሑፍከሁሉም መሪ ቦታዎች ጋር፡-

        Query Text: INSERT INTO  dicquery_20200604  VALUES ($1.*) ON CONFLICT (query)
                           DO NOTHING;
        Insert on dicquery_20200604  (cost=0.00..0.05 rows=1 width=52) (actual time=40.376..40.376 rows=0 loops=1)
          Conflict Resolution: NOTHING
          Conflict Arbiter Indexes: dicquery_20200604_pkey
          Tuples Inserted: 1
          Conflicting Tuples: 0
          Buffers: shared hit=9 read=1 dirtied=1
          ->  Result  (cost=0.00..0.05 rows=1 width=52) (actual time=0.001..0.001 rows=1 loops=1)

እና ምንም ሳይለያዩ በቀጥታ የተገለበጡትን ሁሉንም ነገሮች በእቅዱ መስክ ውስጥ ያስገቡ።

የ PostgreSQL መጠይቅ ዕቅዶችን ይበልጥ በተመቻቸ ሁኔታ መረዳት

መጨረሻ ላይ ለተበተነው እቅድ እና ጉርሻ እናገኛለን "አውድ" ትርልመናችን በክብር የቀረበበት፡

የ PostgreSQL መጠይቅ ዕቅዶችን ይበልጥ በተመቻቸ ሁኔታ መረዳት

JSON እና YAML

EXPLAIN (ANALYZE, BUFFERS, FORMAT JSON)
SELECT * FROM pg_class;

"[
  {
    "Plan": {
      "Node Type": "Seq Scan",
      "Parallel Aware": false,
      "Relation Name": "pg_class",
      "Alias": "pg_class",
      "Startup Cost": 0.00,
      "Total Cost": 1336.20,
      "Plan Rows": 13804,
      "Plan Width": 539,
      "Actual Startup Time": 0.006,
      "Actual Total Time": 1.838,
      "Actual Rows": 10266,
      "Actual Loops": 1,
      "Shared Hit Blocks": 646,
      "Shared Read Blocks": 0,
      "Shared Dirtied Blocks": 0,
      "Shared Written Blocks": 0,
      "Local Hit Blocks": 0,
      "Local Read Blocks": 0,
      "Local Dirtied Blocks": 0,
      "Local Written Blocks": 0,
      "Temp Read Blocks": 0,
      "Temp Written Blocks": 0
    },
    "Planning Time": 5.135,
    "Triggers": [
    ],
    "Execution Time": 2.389
  }
]"

በውጫዊ ጥቅሶች ፣ እንደ pgAdmin ቅጂዎች ፣ ወይም ያለ - ወደ ተመሳሳይ መስክ እንወረውራለን ፣ እና ውጤቱ ውበት ነው

የ PostgreSQL መጠይቅ ዕቅዶችን ይበልጥ በተመቻቸ ሁኔታ መረዳት

የላቀ እይታ

የእቅድ ጊዜ / የአፈፃፀም ጊዜ

አሁን ጥያቄውን ለማስፈጸም ተጨማሪው ጊዜ የት እንደዋለ በተሻለ ማየት ትችላለህ፡-

የ PostgreSQL መጠይቅ ዕቅዶችን ይበልጥ በተመቻቸ ሁኔታ መረዳት

I/O ጊዜ አጠባበቅ

አንዳንድ ጊዜ ከሀብቶች አንፃር ብዙ ያልተነበበ እና የተፃፈ የሚመስል ነገር ግን የአፈፃፀም ጊዜ የማይመጣጠን ረጅም ይመስላል።

እዚህ ማለት አለብን: "ኦህ ፣ ምናልባት በዚያን ጊዜ በአገልጋዩ ላይ ያለው ዲስክ ከመጠን በላይ ተጭኖ ነበር ፣ ለዚያም ነው ለማንበብ ብዙ ጊዜ የፈጀው!ግን በሆነ መንገድ ይህ በጣም ትክክል አይደለም…

ነገር ግን ይህ ሙሉ በሙሉ በአስተማማኝ ሁኔታ ሊወሰን ይችላል. እውነታው ከፒጂ አገልጋይ ውቅር አማራጮች መካከል አለ። track_io_timing:

የI/O ስራዎች ጊዜን ያነቃል። ይህ አማራጭ በነባሪነት ተሰናክሏል ምክንያቱም ለአሁኑ ጊዜ የስርዓተ ክወናውን በየጊዜው መጠየቅ ስለሚፈልግ በአንዳንድ የመሣሪያ ስርዓቶች ላይ አፈጻጸምን በእጅጉ ሊቀንስ ይችላል። በመሣሪያ ስርዓትዎ ላይ ያለውን የጊዜ ወጪ ለመገመት የpg_test_timing መገልገያን መጠቀም ይችላሉ። የI/O ስታቲስቲክስን በpg_stat_database እይታ ማግኘት ይቻላል፣ በEXPLAIN ውፅዓት (የBUFFERS ግቤት ጥቅም ላይ ሲውል) እና በpg_stat_statements እይታ በኩል።

ይህ አማራጭ በአካባቢያዊ ክፍለ ጊዜ ውስጥም ሊነቃ ይችላል፡-

SET track_io_timing = TRUE;

ደህና ፣ አሁን በጣም ጥሩው ክፍል ሁሉንም የማስፈጸሚያ ዛፍ ለውጦችን ከግምት ውስጥ በማስገባት ይህንን መረጃ ለመረዳት እና ለማሳየት ተምረናል-

የ PostgreSQL መጠይቅ ዕቅዶችን ይበልጥ በተመቻቸ ሁኔታ መረዳት

እዚህ ከ 0.790ms ውስጥ ከጠቅላላው የአፈፃፀም ጊዜ 0.718ms አንድ የውሂብ ገጽ አንብቦ 0.044ms መፃፍ እንደወሰደ እና 0.028ms ብቻ ለሁሉም ጠቃሚ ተግባራት ወጪ እንደተደረገ ማየት ይችላሉ!

ወደፊት ከ PostgreSQL 13 ጋር

ስለ ፈጠራዎች አጠቃላይ እይታ ማግኘት ይችላሉ። በዝርዝር ጽሑፍ ውስጥ, እና በተለይ ስለ እቅዶች ለውጦች እየተነጋገርን ነው.

ማቀፊያዎች ማቀድ

ለ መርሐግብር አውጪው የተመደበው ግብዓቶች የሂሳብ አያያዝ ከpg_stat_statements ጋር በማይገናኝ ሌላ መጣፊያ ውስጥ ተንጸባርቋል። በBUFFERS አማራጩ ያብራሩ በእቅድ ዝግጅት ወቅት ጥቅም ላይ የሚውሉትን የመጠባበቂያዎች ብዛት ሪፖርት ያደርጋል፡

 Seq Scan on pg_class (actual rows=386 loops=1)
   Buffers: shared hit=9 read=4
 Planning Time: 0.782 ms
   Buffers: shared hit=103 read=11
 Execution Time: 0.219 ms

የ PostgreSQL መጠይቅ ዕቅዶችን ይበልጥ በተመቻቸ ሁኔታ መረዳት

Инкрементальная сортировка

ብዙ ቁልፎችን መደርደር በሚያስፈልግበት ጊዜ (k1, k2, k3...) እቅድ አውጪው አሁን መረጃው በበርካታ የመጀመሪያ ቁልፎች (ለምሳሌ k1 እና k2) ላይ መደረደሩን ማወቅ ይችላል. በዚህ ሁኔታ ፣ ሁሉንም መረጃዎች እንደገና መደርደር አይችሉም ፣ ግን በተመሳሳይ የ k1 እና k2 እሴት ወደ ተከታታይ ቡድኖች ይከፋፍሉት እና በቁልፍ k3 እንደገና ይደርድሩት።

ስለዚህ, አጠቃላይው መደርደር ወደ ብዙ ተከታታይ ትናንሽ ትናንሽ ዓይነቶች ይከፈላል. ይህ የሚፈለገውን የማህደረ ትውስታ መጠን ይቀንሰዋል እና ሙሉው መደርደር ከመጠናቀቁ በፊት የመጀመሪያው ውሂብ እንዲወጣ ያስችለዋል.

 Incremental Sort (actual rows=2949857 loops=1)
   Sort Key: ticket_no, passenger_id
   Presorted Key: ticket_no
   Full-sort Groups: 92184 Sort Method: quicksort Memory: avg=31kB peak=31kB
   ->  Index Scan using tickets_pkey on tickets (actual rows=2949857 loops=1)
 Planning Time: 2.137 ms
 Execution Time: 2230.019 ms

የ PostgreSQL መጠይቅ ዕቅዶችን ይበልጥ በተመቻቸ ሁኔታ መረዳት
የ PostgreSQL መጠይቅ ዕቅዶችን ይበልጥ በተመቻቸ ሁኔታ መረዳት

UI/UX ማሻሻያዎች

ቅጽበታዊ ገጽ እይታዎች፣ ሁሉም ቦታ ናቸው!

አሁን በእያንዳንዱ ትር ላይ በፍጥነት የመሄድ እድል አለ የትሩን ቅጽበታዊ ገጽ እይታ ወደ ቅንጥብ ሰሌዳው ያንሱ የትርፉን አጠቃላይ ስፋት እና ጥልቀት - በቀኝ አናት ላይ "እይታ".:

የ PostgreSQL መጠይቅ ዕቅዶችን ይበልጥ በተመቻቸ ሁኔታ መረዳት

እንደ እውነቱ ከሆነ, ለዚህ ህትመት አብዛኛዎቹ ስዕሎች የተገኙት በዚህ መንገድ ነው.

በአንጓዎች ላይ ምክሮች

ከነሱ የበለጠ ብቻ ሳይሆን ስለ እያንዳንዱም ማውራት ይችላሉ ጽሑፉን በዝርዝር ያንብቡሊንኩን በመከተል፡-

የ PostgreSQL መጠይቅ ዕቅዶችን ይበልጥ በተመቻቸ ሁኔታ መረዳት

ከማህደር ውስጥ በመሰረዝ ላይ

አንዳንድ ሰዎች በእርግጥ አማራጩን ለመጨመር ጠይቀዋል። "ሙሉ በሙሉ" ሰርዝ በማህደሩ ውስጥ ያልታተሙ እቅዶች እንኳን - እባክዎ ተገቢውን አዶ ጠቅ ያድርጉ።

የ PostgreSQL መጠይቅ ዕቅዶችን ይበልጥ በተመቻቸ ሁኔታ መረዳት

ደህና፣ እንዳለን አትርሳ የድጋፍ ቡድንአስተያየቶችዎን እና አስተያየቶችዎን የሚጽፉበት።

ምንጭ: hab.com

አስተያየት ያክሉ