ื”ื‘ื ืช ืชื›ื ื™ื•ืช ืฉืื™ืœืชื•ืช PostgreSQL ื‘ื™ืชืจ ื ื•ื—ื•ืช

ืœืคื ื™ ื—ืฆื™ ืฉื ื” ื”ืฆื’ื ื• explain.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:

ืžืืคืฉืจ ืชื–ืžื•ืŸ ืฉืœ ืคืขื•ืœื•ืช 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 ื‘ื™ืชืจ ื ื•ื—ื•ืช

ื•ื‘ื›ืŸ, ืืœ ืชืฉื›ื— ืฉื™ืฉ ืœื ื• ืงื‘ื•ืฆืช ืชืžื™ื›ื”, ืฉื‘ื• ืชื•ื›ืœ ืœื›ืชื•ื‘ ืืช ื”ื”ืขืจื•ืช ื•ื”ื”ืฆืขื•ืช ืฉืœืš.

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”