ПонимаСм ΠΏΠ»Π°Π½Ρ‹ PostgreSQL-запросов Π΅Ρ‰Π΅ ΡƒΠ΄ΠΎΠ±Π½Π΅Π΅

Полгода Π½Π°Π·Π°Π΄ ΠΌΡ‹ прСдставили explain.tensor.ru β€” ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹ΠΉ сСрвис для Ρ€Π°Π·Π±ΠΎΡ€Π° ΠΈ Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠ»Π°Π½ΠΎΠ² запросов ΠΊ PostgreSQL.

ПонимаСм ΠΏΠ»Π°Π½Ρ‹ PostgreSQL-запросов Π΅Ρ‰Π΅ ΡƒΠ΄ΠΎΠ±Π½Π΅Π΅

Π—Π° ΠΏΡ€ΠΎΡˆΠ΅Π΄ΡˆΠΈΠ΅ мСсяцы ΠΌΡ‹ сдСлали ΠΏΡ€ΠΎ Π½Π΅Π³ΠΎ Π΄ΠΎΠΊΠ»Π°Π΄ Π½Π° PGConf.Russia 2020, ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΠ»ΠΈ ΠΎΠ±ΠΎΠ±Ρ‰Π°ΡŽΡ‰ΡƒΡŽ ΡΡ‚Π°Ρ‚ΡŒΡŽ ΠΏΠΎ ΡƒΡΠΊΠΎΡ€Π΅Π½ΠΈΡŽ SQL-запросов Π½Π° основС Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½ выдаСт… Π½ΠΎ самоС Π³Π»Π°Π²Π½ΠΎΠ΅ β€” собирали ваши ΠΎΡ‚Π·Ρ‹Π²Ρ‹ ΠΈ смотрСли Π·Π° Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ use case.

И Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ Ρ€Π°ΡΡΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΎ Π½ΠΎΠ²Ρ‹Ρ… возмоТностях, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ.

ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Ρ€Π°Π·Π½Ρ‹Ρ… Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ² ΠΏΠ»Π°Π½ΠΎΠ²

План ΠΈΠ· Π»ΠΎΠ³Π°, вмСстС с запросом

ΠŸΡ€ΡΠΌΠΎ с консоли выдСляСм вСсь Π±Π»ΠΎΠΊ, начиная со строки с Query Text, со всСми Π»ΠΈΠ΄ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΌΠΈ ΠΏΡ€ΠΎΠ±Π΅Π»Π°ΠΌΠΈ:

        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-запросов Π΅Ρ‰Π΅ ΡƒΠ΄ΠΎΠ±Π½Π΅Π΅

Π Π°ΡΡˆΠΈΡ€Π΅Π½Π½Π°Ρ визуализация

Planning Time / Execution Time

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π»ΡƒΡ‡ΡˆΠ΅ Π²ΠΈΠ΄Π½ΠΎ, ΠΊΡƒΠ΄Π° ΡƒΡˆΠ»ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ врСмя ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ запроса:

ПонимаСм ΠΏΠ»Π°Π½Ρ‹ PostgreSQL-запросов Π΅Ρ‰Π΅ ΡƒΠ΄ΠΎΠ±Π½Π΅Π΅

I/O Timing

Иногда приходится ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°Ρ‚ΡŒΡΡ с ситуациСй, ΠΊΠΎΠ³Π΄Π° Π² ΠΏΠ»Π°Π½Π΅ Π²Ρ€ΠΎΠ΄Π΅ ΠΈ рСсурсов Ρ‡ΠΈΡ‚Π°Π»ΠΎΡΡŒ-писалось Π½Π΅ слишком ΠΌΠ½ΠΎΠ³ΠΎ, Π° Π²Ρ€ΠΎΠ΄Π΅ ΠΈ врСмя выполнСния нСсообразно большоС ΠΊΠ°ΠΊΠΎΠ΅-Ρ‚ΠΎ.

Π’ΡƒΡ‚ приходится Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ: "Ой, Π½Π°Π²Π΅Ρ€Π½ΠΎΠ΅, Π² Ρ‚ΠΎΡ‚ ΠΌΠΎΠΌΠ΅Π½Ρ‚ диск Π½Π° сСрвСрС Π±Ρ‹Π» слишком ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½, поэтому Ρ‡ΠΈΡ‚Π°Π»ΠΎΡΡŒ Ρ‚Π°ΠΊ Π΄ΠΎΠ»Π³ΠΎ!" Но ΠΊΠ°ΠΊ-Ρ‚ΠΎ это Π½Π΅ слишком точно…

Но ΠΌΠΎΠΆΠ½ΠΎ это ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ достовСрно. Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ срСди ΠΎΠΏΡ†ΠΈΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ PG-сСрвСра Π΅ΡΡ‚ΡŒ track_io_timing:

Π’ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π·Π°ΠΌΠ΅Ρ€ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°. Π­Ρ‚ΠΎΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Ρ‘Π½, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ для этого трСбуСтся постоянно Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Ρ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ врСмя Ρƒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π·Π°ΠΌΠ΅Π΄Π»ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ Π½Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ…. Для оцСнивания ΠΈΠ·Π΄Π΅Ρ€ΠΆΠ΅ΠΊ Π·Π°ΠΌΠ΅Ρ€Π° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π° вашСй ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ΠΎΠΉ pg_test_timing. Бтатистику Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· прСдставлСниС pg_stat_database, Π² Π²Ρ‹Π²ΠΎΠ΄Π΅ EXPLAIN (ΠΊΠΎΠ³Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ BUFFERS) ΠΈ Ρ‡Π΅Ρ€Π΅Π· прСдставлСниС pg_stat_statements.

Π­Ρ‚ΠΎΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΈ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… локальной сСссии:

SET track_io_timing = TRUE;

Ну, Π° Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ самоС приятноС β€” ΠΌΡ‹ Π½Π°ΡƒΡ‡ΠΈΠ»ΠΈΡΡŒ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ эти Π΄Π°Π½Π½Ρ‹Π΅ с ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ всСх трансформаций Π΄Π΅Ρ€Π΅Π²Π° исполнСния:

ПонимаСм ΠΏΠ»Π°Π½Ρ‹ PostgreSQL-запросов Π΅Ρ‰Π΅ ΡƒΠ΄ΠΎΠ±Π½Π΅Π΅

Π’ΡƒΡ‚ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΈΠ· 0.790ms всСго Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ исполнСния 0.718ms заняло Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠΉ страницы Π΄Π°Π½Π½Ρ‹Ρ…, 0.044ms β€” запись Π΅Π΅ ΠΆΠ΅, Π° Π½Π° всю ΠΎΡΡ‚Π°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠΎΠ»Π΅Π·Π½ΡƒΡŽ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ Π±Ρ‹Π»ΠΎ ΠΏΠΎΡ‚Ρ€Π°Ρ‡Π΅Π½ΠΎ всСго 0.028ms!

Π‘ΡƒΠ΄ΡƒΡ‰Π΅Π΅ с PostgreSQL 13

ΠžΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ с ΠΏΠΎΠ»Π½Ρ‹ΠΌ ΠΎΠ±Π·ΠΎΡ€ΠΎΠΌ Π½ΠΎΠ²ΠΎΠ²Π²Π΅Π΄Π΅Π½ΠΈΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π² ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅, Π° ΠΌΡ‹ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ ΠΏΡ€ΠΎ измСнСния Π² ΠΏΠ»Π°Π½Π°Ρ….

Planning buffers

Π£Ρ‡Π΅Ρ‚ рСсурсов, Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΡƒ, нашСл своС ΠΎΡ‚Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π΅Ρ‰Π΅ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΏΠ°Ρ‚Ρ‡Π΅, Π½Π΅ относящСмуся ΠΊ pg_stat_statements. EXPLAIN с ΠΎΠΏΡ†ΠΈΠ΅ΠΉ 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-запросов Π΅Ρ‰Π΅ ΡƒΠ΄ΠΎΠ±Π½Π΅Π΅

Ну, ΠΈ Π½Π΅ Π·Π°Π±Ρ‹Π²Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Ρƒ нас Π΅ΡΡ‚ΡŒ Π³Ρ€ΡƒΠΏΠΏΠ° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ, ΠΊΡƒΠ΄Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΈΡΠ°Ρ‚ΡŒ свои замСчания ΠΈ прСдлоТСния.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com