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 рд╕рдордп

рдХрд╣рд┐рд▓реЗрдХрд╛рд╣реАрдБ рддрдкрд╛рдИрд▓реЗ рдпрд╕реНрддреЛ рдЕрд╡рд╕реНрдерд╛рдХреЛ рд╕рд╛рдордирд╛ рдЧрд░реНрдиреБрдкрд░реНрдиреЗ рд╣реБрдиреНрдЫ рдЬрд╣рд╛рдБ, рд╕реНрд░реЛрддрдХреЛ рд╣рд┐рд╕рд╛рдмрд▓реЗ, рдпреЛ рдзреЗрд░реИ рдкрдвреНрди рд░ рд▓реЗрдЦрд┐рдПрдХреЛ рдерд┐рдПрди, рддрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рдордп рдЕрд╕рдВрдЧрдд рд░реВрдкрдорд╛ рд▓рд╛рдореЛ рдЫ рдЬрд╕реНрддреЛ рджреЗрдЦрд┐рдиреНрдЫред

рдпрд╣рд╛рдБ рд╣рд╛рдореАрд▓реЗ рднрдиреНрдиреБ рдкрд░реНрдЫ: "рдУрд╣, рд╕рд╛рдпрдж рддреНрдпреЛ рдХреНрд╖рдгрдорд╛ рд╕рд░реНрднрд░рдорд╛ рдбрд┐рд╕реНрдХ рдзреЗрд░реИ рдУрднрд░рд▓реЛрдб рднрдПрдХреЛ рдерд┐рдпреЛ, рддреНрдпрд╕реИрд▓реЗ рдпреЛ рдкрдвреНрди рдзреЗрд░реИ рд╕рдордп рд▓рд╛рдЧреНрдпреЛ!"рддрд░ рдХреБрдиреИ рди рдХреБрдиреИ рд░реВрдкрдорд╛ рдпреЛ рдзреЗрд░реИ рд╕рд╣реА рдЫреИрди ...

рддрд░ рдпреЛ рдмрд┐рд▓реНрдХреБрд▓ рднрд░рдкрд░реНрджреЛ рдирд┐рд░реНрдзрд╛рд░рдг рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред рддрдереНрдп рдпреЛ рд╣реЛ рдХрд┐ PG рд╕рд░реНрднрд░ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рд╡рд┐рдХрд▓реНрдкрд╣рд░реВ рдмреАрдЪ рддреНрдпрд╣рд╛рдБ рдЫ track_io_timing:

I/O рд╕рдЮреНрдЪрд╛рд▓рдирдХреЛ рд╕рдордп рд╕рдХреНрд╖рдо рдЧрд░реНрджрдЫред рдпреЛ рд╡рд┐рдХрд▓реНрдкрд▓рд╛рдИ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд░реВрдкрдорд╛ рдЕрд╕рдХреНрд╖рдо рдЧрд░рд┐рдПрдХреЛ рдЫ рдХрд┐рдирднрдиреЗ рдпрд╕рд▓реЗ рд╣рд╛рд▓рдХреЛ рд╕рдордпрдХреЛ рд▓рд╛рдЧрд┐ рдЕрдкрд░реЗрдЯрд┐рдЩ рд╕рд┐рд╕реНрдЯрдорд▓рд╛рдИ рдирд┐рд░рдиреНрддрд░ рдХреНрд╡реЗрд░реА рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ, рдЬрд╕рд▓реЗ рдХреЗрд╣реА рдкреНрд▓реЗрдЯрдлрд░реНрдорд╣рд░реВрдорд╛ рдХрд╛рд░реНрдпрд╕рдореНрдкрд╛рджрдирд▓рд╛рдИ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд░реВрдкрдорд╛ рдХрдо рдЧрд░реНрди рд╕рдХреНрдЫред рддрдкрд╛рдЗрдБрдХреЛ рдкреНрд▓реЗрдЯрдлрд░реНрдордорд╛ рд╕рдордпрдХреЛ рд▓рд╛рдЧрдд рдЕрдиреБрдорд╛рди рдЧрд░реНрди, рддрдкрд╛рдЗрдБ pg_test_timing рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред I/O рддрдереНрдпрд╛рдЩреНрдХрд╣рд░реВ pg_stat_database рджреГрд╢реНрдп рдорд╛рд░реНрдлрдд рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ, EXPLAIN рдЖрдЙрдЯрдкреБрдЯрдорд╛ (рдЬрдм рдмрдлрд░реНрд╕ тАЛтАЛрдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░ рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреНрдЫ) рд░ 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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди