ืคืืจืฉื˜ืื ื“ ืคื•ืŸ PostgreSQL ืึธื ืคึฟืจืขื’ ืคึผืœืึทื ื– ืืคื™ืœื• ืžืขืจ ืงืึทื ื•ื•ื™ื ื™ืึทื ื˜ืœื™

ืึท ื”ืึทืœื‘ ื™ืึธืจ ืฆื•ืจื™ืง ืžื™ืจ ื“ืขืจืœืื ื’ื˜ explain.tensor.ru - ืขืคื ื˜ืœืขืš ืกืขืจื•ื•ื™ืก ืคึฟืึทืจ ืคึผืึทืจืกื™ื ื’ ืื•ืŸ ื•ื•ื™ื–ืฉื•ื•ืึทืœื™ื™ื–ื™ื ื’ ืึธื ืคึฟืจืขื’ ืคึผืœืึทื ื– ืฆื• PostgreSQL.

ืคืืจืฉื˜ืื ื“ ืคื•ืŸ PostgreSQL ืึธื ืคึฟืจืขื’ ืคึผืœืึทื ื– ืืคื™ืœื• ืžืขืจ ืงืึทื ื•ื•ื™ื ื™ืึทื ื˜ืœื™

ืื™ืŸ ื“ื™ ืœืขืฆื˜ืข ื—ื“ืฉื™ื ืžื™ืจ ื”ืึธื‘ืŸ ื’ืขืžืื›ื˜ ื•ื•ืขื’ืŸ ืื™ื ื‘ืึทืจื™ื›ื˜ ื‘ื™ื™ PGConf.Russia 2020, ืฆื•ื’ืขื’ืจื™ื™ื˜ ืึท ืงื™ืฆืขืจ ืึทืจื˜ื™ืงืœ ื•ื•ืขื’ืŸ ืกืคึผื™ื“ื™ื ื’ ืกืงืœ ืงื•ื•ื™ืจื™ื– ื‘ืื–ื™ืจื˜ ืื•ื™ืฃ ื“ื™ ืจืขืงืึทืžืึทื ื“ื™ื™ืฉืึทื ื– ืขืก ื’ื™ื˜ ... ืึธื‘ืขืจ ืจื•ื‘ึฟ ื™ืžืคึผืึธืจื˜ืึทื ื˜ืœื™, ืžื™ืจ ื’ืขื–ืืžืœื˜ ื“ื™ื™ืŸ ื‘ืึทืžืขืจืงื•ื ื’ืขืŸ ืื•ืŸ ื’ืขืงื•ืงื˜ ืื•ื™ืฃ ืคืึทืงื˜ื™ืฉ ื ื•ืฆืŸ ืงืึทืกืขืก.

ืื•ืŸ ืื™ืฆื˜ ืžื™ืจ ื–ืขื ืขืŸ ื’ืจื™ื™ื˜ ืฆื• ืจืขื“ืŸ ื•ื•ืขื’ืŸ ื ื™ื™ึทืข ืึทืคึผืขืจื˜ื•ื ืึทื˜ื™ื– ื•ื•ืึธืก ืื™ืจ ืงืขื ืขืŸ ื ื•ืฆืŸ.

ืฉื˜ื™ืฆืŸ ืคึฟืึทืจ ืคืึทืจืฉื™ื“ืขื ืข ืคึผืœืึทืŸ ืคึฟืึธืจืžืึทื˜ื™ืจื•ื ื’ืขืŸ

ืคึผืœืึทืŸ ืคื•ืŸ ื“ื™ ืงืœืึธืฅ, ืฆื•ื–ืืžืขืŸ ืžื™ื˜ ื“ื™ ื‘ืงืฉื”

ื’ืœื™ื™ืš ืคึฟื•ืŸ ื“ื™ ืงืึทื ืกืึธื•ืœ, ืื•ื™ืกืงืœื™ื™ึทื‘ืŸ ื“ื™ ื’ืื ืฆืข ื‘ืœืึธืง, ืกื˜ืึทืจื˜ื™ื ื’ ืคื•ืŸ ื“ื™ ืฉื•ืจื” ืžื™ื˜ ืึธื ืคึฟืจืขื’ ื˜ืขืงืกื˜, ืžื™ื˜ ืึทืœืข ืœื™ื“ื™ื ื’ ืกืคึผื™ื™ืกืึทื–:

        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
  }
]"

ืึธื“ืขืจ ืžื™ื˜ ืคื•ื ื“ืจื•ื™ืกื ื“ื™ืง ืฆื™ื˜ื™ืจื˜, ื•ื•ื™ ืคึผื’ืึทื“ืžื™ืŸ ืงืืคื™ืขืก, ืึธื“ืขืจ ืึธืŸ - ืžื™ืจ ื•ื•ืึทืจืคืŸ ืขืก ืื™ืŸ ื“ื™ ื–ืขืœื‘ืข ืคืขืœื“, ืื•ืŸ ื“ืขืจ ืจืขื–ื•ืœื˜ืึทื˜ ืื™ื– ืฉื™ื™ื ืงื™ื™ื˜:

ืคืืจืฉื˜ืื ื“ ืคื•ืŸ PostgreSQL ืึธื ืคึฟืจืขื’ ืคึผืœืึทื ื– ืืคื™ืœื• ืžืขืจ ืงืึทื ื•ื•ื™ื ื™ืึทื ื˜ืœื™

ืึทื•ื•ืึทื ืกื™ืจื˜ืข ื•ื•ื™ืกื•ืึทืœื™ื–ืึทื˜ื™ืึธืŸ

ืคึผืœืึทื ื™ืจื•ื ื’ ืฆื™ื™ื˜ / ื“ื•ืจื›ืคื™ืจื•ื ื’ ืฆื™ื™ื˜

ืื™ืฆื˜ ืื™ืจ ืงืขื ืขืŸ ื‘ืขืกืขืจ ื–ืขืŸ ื•ื•ื• ื“ื™ ืขืงืกื˜ืจืข ืฆื™ื™ื˜ ืื™ื– ืคืืจื‘ืจืื›ื˜ ืฆื• ื“ื•ืจื›ืคื™ืจืŸ ื“ื™ ืึธื ืคึฟืจืขื’:

ืคืืจืฉื˜ืื ื“ ืคื•ืŸ PostgreSQL ืึธื ืคึฟืจืขื’ ืคึผืœืึทื ื– ืืคื™ืœื• ืžืขืจ ืงืึทื ื•ื•ื™ื ื™ืึทื ื˜ืœื™

ืื™ืš / ืึธ ื˜ื™ื™ืžื™ื ื’

ืžืืœ ืื™ืจ ื”ืึธื‘ืŸ ืฆื• ื”ืึทื ื“ืœืขืŸ ืžื™ื˜ ืึท ืกื™ื˜ื•ืึทืฆื™ืข ื•ื•ื•, ืื™ืŸ ื˜ืขืจืžื™ื ืขืŸ ืคื•ืŸ ืจืขืกื•ืจืกืŸ, ืขืก ืžื™ื™ื ื˜ ืึทื– ื ื™ืฉื˜ ืฆื• ืคื™ืœ ืื™ื– ื’ืขื•ื•ืขืŸ ืœื™ื™ืขื ืขืŸ ืื•ืŸ ื’ืขืฉืจื™ื‘ืŸ, ืึธื‘ืขืจ ื“ื™ ื“ื•ืจื›ืคื™ืจื•ื ื’ ืฆื™ื™ื˜ ืžื™ื™ื ื˜ ืฆื• ื–ื™ื™ืŸ ื™ื ืงืึทื ื’ืจื•ืึทืกืœื™ ืœืึทื ื’.

ื“ืึธ ืžื™ืจ ื”ืึธื‘ืŸ ืฆื• ื–ืึธื’ืŸ: "ืึธื”, ืžื™ืกื˜ืึธืžืข ืื™ืŸ ื“ืขื ืžืึธืžืขื ื˜ ื“ื™ ื“ื™ืกืง ืื•ื™ืฃ ื“ื™ ืกืขืจื•ื•ืขืจ ืื™ื– ืื•ื™ืš ืึธื•ื•ื•ืขืจืœืึธื•ื“ื™ื“, ื“ืึธืก ืื™ื– ื•ื•ืึธืก ืขืก ื’ืขื ื•ืžืขืŸ ืึทื–ื•ื™ ืœืึทื ื’ ืฆื• ืœื™ื™ืขื ืขืŸ!"ืึธื‘ืขืจ ืขืคืขืก ืื™ื– ื“ืึธืก ื ื™ืฉื˜ ื–ื™ื™ืขืจ ืคึผื™ื ื˜ืœืขืš ...

ืื‘ืขืจ ื“ืขื ืงืขื ืขืŸ ื–ื™ื™ืŸ ื‘ืืฉืœืืกืŸ ืœืขื’ืึทืžืจืข ืจื™ืœื™ื™ืึทื‘ืœื™. ื“ืขืจ ืคืึทืงื˜ ืื™ื– ืึทื– ืฆื•ื•ื™ืฉืŸ ื“ื™ PG ืกืขืจื•ื•ืขืจ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืึธืคึผืฆื™ืขืก ืขืก ืื™ื– track_io_timing:

ื™ื ื™ื™ื‘ืึทืœื– ื˜ื™ื™ืžื™ื ื’ ืคื•ืŸ ื™ / ืึธ ืึทืคึผืขืจื™ื™ืฉืึทื ื–. ื“ืขืจ ืึธืคึผืฆื™ืข ืื™ื– ืคืึทืจืงืจื™ืคึผืœื˜ ื“ื•ืจืš ืคืขืœื™ืงื™ื™ึทื˜ ื•ื•ื™ื™ึทืœ ืขืก ืจื™ืงื•ื•ื™ื™ืขืจื– ืงืขืกื™ื™ื“ืขืจื“ื™ืง ืึธื ืคึฟืจืขื’ ื“ื™ ืึธืคึผืขืจื™ื™ื˜ื™ื ื’ ืกื™ืกื˜ืขื ืคึฟืึทืจ ื“ื™ ืงืจืึทื ื˜ ืฆื™ื™ื˜, ื•ื•ืึธืก ืงืขื ืขืŸ ื‘ืื˜ื™ื™ื˜ื™ืง ืคึผืึทืžืขืœืขืš ื“ื™ ืคืึธืจืฉื˜ืขืœื•ื ื’ ืื•ื™ืฃ ืขื˜ืœืขื›ืข ืคึผืœืึทื˜ืคืึธืจืžืก. ืฆื• ืึธืคึผืฉืึทืฆืŸ ื“ื™ ืคึผืจื™ื™ึทื– ืคื•ืŸ ื˜ื™ื™ืžื™ื ื’ ืื•ื™ืฃ ื“ื™ื™ืŸ ืคึผืœืึทื˜ืคืึธืจืžืข, ืื™ืจ ืงืขื ืขืŸ ื ื•ืฆืŸ ื“ื™ pg_test_timing ื ื•ืฆืŸ. ืื™ืš / ืึธ ืกื˜ืึทื˜ื™ืกื˜ื™ืง ืงืขื ืขืŸ ื–ื™ื™ืŸ ื‘ืืงื•ืžืขืŸ ื“ื•ืจืš ื“ื™ pg_stat_database View, ืื™ืŸ ื“ื™ 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 ืึธื ืคึฟืจืขื’ ืคึผืœืึทื ื– ืืคื™ืœื• ืžืขืจ ืงืึทื ื•ื•ื™ื ื™ืึทื ื˜ืœื™

ื™ื ืงืจืขืžืขื ื˜ืึทืœ ืกืึธืจื˜ื™ื ื’

ืื™ืŸ ืงืึทืกืขืก ื•ื•ื• ืกืึธืจื˜ื™ื ื’ ืื•ื™ืฃ ืคื™ืœืข ืฉืœื™ืกืœืขืŸ ืื™ื– ื“ืืจืฃ (ืง1, ืง2, ืง3...), ื“ืขืจ ืคึผืœืึทื ืขืจ ืงืขื ืขืŸ ืื™ืฆื˜ ื ื•ืฆืŸ ื“ื™ ื•ื•ื™ืกืŸ ืึทื– ื“ื™ ื“ืึทื˜ืŸ ื–ืขื ืขืŸ ืฉื•ื™ืŸ ืื•ื™ืกื’ืขืฉื˜ืขืœื˜ ืื•ื™ืฃ ืขื˜ืœืขื›ืข ืคื•ืŸ โ€‹โ€‹ื“ื™ ืขืจืฉื˜ืขืจ ืฉืœื™ืกืœืขืŸ (ืœืžืฉืœ, ืง1 ืื•ืŸ ืง2). ืื™ืŸ ื“ืขื ืคืึทืœ, ืื™ืจ ืงืขื ืขืŸ ื ื™ืฉื˜ ืฉื™ื™ึทืขืš-ืกืึธืจื˜ ืึทืœืข ื“ื™ ื“ืึทื˜ืŸ ื•ื•ื™ื“ืขืจ, ืึธื‘ืขืจ ื˜ื™ื™ืœืŸ ืขืก ืื™ืŸ ืกืึทืงืกืขืกื™ื•ื• ื’ืจื•ืคึผืขืก ืžื™ื˜ ื“ื™ ื–ืขืœื‘ืข ื•ื•ืึทืœื•ืขืก ืคื•ืŸ ืง1 ืื•ืŸ ืง2, ืื•ืŸ "ืฉื™ื™ึทืขืš-ืกืึธืจื˜" ืขืก ื“ื•ืจืš ืฉืœื™ืกืœ ืง3.

ืื–ื•ื™, ื“ื™ ื’ืื ืฆืข ืกืึธืจื˜ื™ืจื•ื ื’ ืื™ื– ืฆืขื˜ื™ื™ืœื˜ ืื™ืŸ ืขื˜ืœืขื›ืข ืกืึทืงืกืขืกื™ื•ื• ืกืึธืจืฅ ืคื•ืŸ ืงืœืขื ืขืจืขืจ ื’ืจื™ื™ืก. ื“ืึธืก ืจืึทื“ื•ืกืึทื– ื“ื™ ืกื•ืžืข ืคื•ืŸ โ€‹โ€‹โ€‹โ€‹ื–ื™ืงืึธืจืŸ ืคืืจืœืื ื’ื˜ ืื•ืŸ ืื•ื™ืš ืึทืœืึทื•ื– ื“ื™ ืขืจืฉื˜ืขืจ ื“ืึทื˜ืŸ ืฆื• ื–ื™ื™ืŸ ืคึผืจืึธื“ื•ืงืฆื™ืข ืื™ื™ื“ืขืจ ื“ื™ ื’ืื ืฆืข ืกืึธืจื˜ื™ื ื’ ืื™ื– ื’ืขืขื ื“ื™ืงื˜.

 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

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’