рдбреЗрдв рд╡рд░реНрд╖рдЕрдШрд┐рдХреЛ рдХреБрд░рд╛ рд╣реЛ
рдкрдЫрд┐рд▓реНрд▓рд╛ рдорд╣рд┐рдирд╛рд╣рд░реВрдорд╛ рд╣рд╛рдореАрд▓реЗ рдЙрд╣рд╛рдБрдХреЛ рдмрд╛рд░реЗрдорд╛ рдЧрд░реЗрдХрд╛ рдЫреМрдВ
рд░ рдЕрдм рд╣рд╛рдореА рддрдкрд╛рдИрд▓реЗ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХреНрдиреЗ рдирдпрд╛рдБ рдЕрд╡рд╕рд░рд╣рд░реВрдХреЛ рдмрд╛рд░реЗрдорд╛ рдХреБрд░рд╛ рдЧрд░реНрди рддрдпрд╛рд░ рдЫреМрдВред
рд╡рд┐рднрд┐рдиреНрди рдпреЛрдЬрдирд╛ рдврд╛рдБрдЪрд╛рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рд╕рдорд░реНрдерди
рд▓рдЧрдмрд╛рдЯ рдпреЛрдЬрдирд╛, рдЕрдиреБрд░реЛрдз рд╕рд╣рд┐рдд
рдХрдиреНрд╕реЛрд▓рдмрд╛рдЯ рд╕реАрдзрд╛, рд╕рдореНрдкреВрд░реНрдг рдмреНрд▓рдХ рдЪрдпрди рдЧрд░реНрдиреБрд╣реЛрд╕реН, рд░реЗрдЦрд╛рдмрд╛рдЯ рд╕реБрд░реБ рдЧрд░реНрджреИ рдкреНрд░рд╢реНрди рдкрд╛рда, рд╕рдмреИ рдкреНрд░рдореБрдЦ рд╕реНрдерд╛рдирд╣рд░реБ рд╕рдВрдЧ:
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)
... рд░ рд╕рдмреИ рдЪреАрдЬрд╣рд░реВ рд╕реАрдзрд╛ рдпреЛрдЬрдирд╛ рдХреНрд╖реЗрддреНрд░рдорд╛ рд░рд╛рдЦреНрдиреБрд╣реЛрд╕реН, рдХреЗрд╣рд┐ рдкрдирд┐ рдЕрд▓рдЧ рдирдЧрд░реА:
рдЕрдиреНрддрдорд╛ рд╣рд╛рдореАрд▓реЗ рдЫреБрдЯреНрдпрд╛рдЗрдПрдХреЛ рдпреЛрдЬрдирд╛рдорд╛ тАЛтАЛрдмреЛрдирд╕ рдкрд╛рдЙрдБрдЫреМрдВ рд░ "рд╕рдиреНрджрд░реНрдн" рдЯреНрдпрд╛рдм, рдЬрд╣рд╛рдБ рд╣рд╛рдореНрд░реЛ рдЕрдиреБрд░реЛрдз рд╕рдмреИ рдорд╣рд┐рдорд╛рдорд╛ рдкреНрд░рд╕реНрддреБрдд рдЧрд░рд┐рдПрдХреЛ рдЫ:
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 рдкреНрд░рддрд┐рд▓рд┐рдкрд┐рд╣рд░реВрдХреЛ рд░реВрдкрдорд╛, рд╡рд╛ рдмрд┐рдирд╛ - рд╣рд╛рдореА рдпрд╕рд▓рд╛рдИ рдПрдЙрдЯреИ рдХреНрд╖реЗрддреНрд░рдорд╛ рдлреНрдпрд╛рдБрдХреНрдЫреМрдВ, рд░ рдЖрдЙрдЯрдкреБрдЯ рд╕реБрдиреНрджрд░рддрд╛ рд╣реЛ:
рдЙрдиреНрдирдд рднрд┐рдЬреБрдЕрд▓рд╛рдЗрдЬреЗрд╢рди
рдпреЛрдЬрдирд╛ рд╕рдордп/рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рдордп
рдЕрдм рддрдкрд╛рдИрд▓реЗ рд░рд╛рдореНрд░реЛрд╕рдБрдЧ рд╣реЗрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рдЬрд╣рд╛рдБ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдордп рдХреНрд╡реЗрд░реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрди рдЦрд░реНрдЪ рднрдпреЛ:
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;
рдард┐рдХ рдЫ, рдЕрдм рд╕рдмреИрднрдиреНрджрд╛ рд░рд╛рдореНрд░реЛ рдкрдХреНрд╖ рдпреЛ рд╣реЛ рдХрд┐ рд╣рд╛рдореАрд▓реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд░реВрдЦрдХреЛ рд╕рдмреИ рд░реВрдкрд╛рдиреНрддрд░рдгрд╣рд░реВрд▓рд╛рдИ рдзреНрдпрд╛рдирдорд╛ рд░рд╛рдЦреНрджреИ рдпреЛ рдбрд╛рдЯрд╛ рдмреБрдЭреНрди рд░ рдкреНрд░рджрд░реНрд╢рди рдЧрд░реНрди рд╕рд┐рдХреЗрдХрд╛ рдЫреМрдВ:
рдпрд╣рд╛рдБ рддрдкрд╛рдИрд▓реЗ рджреЗрдЦреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рдХрд┐ рдХреБрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рдордпрдХреЛ 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
рдмрдвреНрджреЛ рдХреНрд░рдордмрджреНрдз
рдзреЗрд░реИ рдХреБрдЮреНрдЬреАрд╣рд░реВрдорд╛ рдХреНрд░рдордмрджреНрдз рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рднрдПрдХреЛ рдЕрд╡рд╕реНрдерд╛рдорд╛ (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
UI/UX рд╕реБрдзрд╛рд░рд╣рд░реВ
рд╕реНрдХреНрд░рд┐рдирд╕рдЯрд╣рд░реВ, рддрд┐рдиреАрд╣рд░реВ рдЬрддрд╛рддрддреИ рдЫрдиреН!
рдЕрдм рдкреНрд░рддреНрдпреЗрдХ рдЯреНрдпрд╛рдмрдорд╛ рдЫрд┐рдЯреНрдЯреИ рдореМрдХрд╛ рдЫ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдбрдорд╛ рдЯреНрдпрд╛рдмрдХреЛ рд╕реНрдХреНрд░рд┐рдирд╕рдЯ рд▓рд┐рдиреБрд╣реЛрд╕реН рдЯреНрдпрд╛рдмрдХреЛ рд╕рдореНрдкреВрд░реНрдг рдЪреМрдбрд╛рдЗ рд░ рдЧрд╣рд┐рд░рд╛рдИ - рджрд╛рдпрд╛рдБ-рд╢реАрд░реНрд╖рдорд╛ "рджреГрд╢реНрдп":
рд╡рд╛рд╕реНрддрд╡рдорд╛, рдпрд╕ рдкреНрд░рдХрд╛рд╢рдирдХрд╛ рд▓рд╛рдЧрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рддрд╕реНрд╡рд┐рд░рд╣рд░реВ рдпрд╕рд░реА рдкреНрд░рд╛рдкреНрдд рдЧрд░рд┐рдПрдХрд╛ рдерд┐рдПред
рдиреЛрдбрд╣рд░реВрдорд╛ рд╕рд┐рдлрд╛рд░рд┐рд╕рд╣рд░реВ
рди рдХреЗрд╡рд▓ рддреНрдпрд╣рд╛рдБ рддрд┐рдиреАрд╣рд░реВрдордзреНрдпреЗ рдзреЗрд░реИ рдмрдиреЗрдХрд╛ рдЫрдиреН, рддрд░ рддрдкрд╛рдИрдВ рдкреНрд░рддреНрдпреЗрдХрдХреЛ рдмрд╛рд░реЗрдорд╛ рдкрдирд┐ рдХреБрд░рд╛ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ
рдЕрднрд┐рд▓реЗрдЦрдмрд╛рдЯ рдореЗрдЯрд╛рдЙрдБрджреИ
рдХреЗрд╣реА рд╡реНрдпрдХреНрддрд┐рд╣рд░реВрд▓реЗ рд╡рд╛рд╕реНрддрд╡рдореИ рд╡рд┐рдХрд▓реНрдк рдердкреНрди рдЖрдЧреНрд░рд╣ рдЧрд░реЗ "рдкреВрд░реНрдг рд░реВрдкрдорд╛" рдореЗрдЯреНрдиреБрд╣реЛрд╕реН рдЕрднрд┐рд▓реЗрдЦрдорд╛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдирднрдПрдХрд╛ рдпреЛрдЬрдирд╛рд╣рд░реВ рдкрдирд┐ - рдХреГрдкрдпрд╛ рдЙрдкрдпреБрдХреНрдд рдЖрдЗрдХрдирдорд╛ рдХреНрд▓рд┐рдХ рдЧрд░реНрдиреБрд╣реЛрд╕реН:
рдЦреИрд░, рд╣рд╛рдореАрд╕рдБрдЧ рдЫ рднрдиреЗрд░ рдирдмрд┐рд░реНрд╕рдиреБрд╣реЛрд╕реН
рд╕реНрд░реЛрдд: www.habr.com