Фаҳмидани нақшаҳои дархости PostgreSQL боз ҳам қулайтар аст

Ним сол пеш пешниҳод кардем izah.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

Баъзан шумо бояд бо вазъияте рӯ ба рӯ шавед, ки аз рӯи захираҳо, ба назар чунин мерасад, ки аз ҳад зиёд хондану навишта нашудааст, аммо ба назар чунин менамояд, ки вақти иҷроиш бо баъзе сабабҳо номувофиқ аст.

Дар ин ҷо бояд гуфт:Эҳтимол, дар он лаҳза диски сервер аз ҳад зиёд пурбор шуда буд, бинобар ин хондан ин қадар тӯл кашид!"Аммо гӯё он қадар дақиқ нест ...

Аммо онро комилан боэътимод муайян кардан мумкин аст. Далели он аст, ки дар байни вариантҳои конфигуратсияи сервери PG мавҷуданд track_io_timing:

Амалиётҳои воридот / баромади вақтро фаъол мекунад. Ин танзимот ба таври нобаёнӣ ғайрифаъол аст, зеро он аз системаи оператсионӣ талаб мекунад, ки пайваста вақти ҷорӣро пурсад, ки метавонад корҳоро дар баъзе платформаҳо ба таври назаррас суст кунад. Шумо метавонед утилитаи pg_test_timing -ро барои ҳисоб кардани хароҷоти вақт дар платформаи худ истифода баред. Омори вуруд/баҳоро тавассути намоиши pg_stat_database ба даст овардан мумкин аст, дар баромади EXPLAIN (вақте ки параметри BUFFERS истифода мешавад) ва тавассути намуди pg_stat_statements.

Ин хосият инчунин метавонад дар як ҷаласаи маҳаллӣ фаъол карда шавад:

SET track_io_timing = TRUE;

Хуб, ҳоло беҳтарин қисми он аст, ки мо фаҳмидан ва намоиш додани ин маълумотро бо назардошти ҳама тағиротҳои дарахти иҷро омӯхтаем:

Фаҳмидани нақшаҳои дархости PostgreSQL боз ҳам қулайтар аст

Дар ин ҷо шумо мебинед, ки аз 0.790 ms вақти умумии иҷро, 0.718 мс як саҳифаи маълумотро хондааст, 0.044 мс - навиштани он ва танҳо 0.028 мс барои ҳама корҳои муфиди дигар сарф шудааст!

Оянда бо 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 боз ҳам қулайтар аст

Хуб, биёед фаромӯш накунем, ки мо дорем Гурӯҳи дастгирӣки дар он фикру мулохиза ва таклифхои худро навиштан мумкин аст.

Манбаъ: will.com

Илова Эзоҳ