Объяснить анализ: общее время, затраченное на выполнение задачи.Ошибка в документации или моя ошибка? - PullRequest
0 голосов
/ 25 марта 2019

Я думаю, что нашел ошибку и возможное исправление в документации postgres относительно планов объяснения.

От: https://www.postgresql.org/docs/current/using-explain.html

Index Scan using tenk2_unique2 on tenk2 t2  (cost=0.29..7.91 rows=1 width=244) (actual time=0.021..0.022 rows=1 loops=10)

"В приведенном выше примере мы потратилив общей сложности 0,220 миллисекунд, выполняющих сканирование индекса на tenk2. "

Документы могут показывать Actual Total Time * Actual Loops = общее время, потраченное на операцию.

Однако из плана JSON, который я произвел:

 "Plans": [
        {
          "Node Type": "Hash Join",
          "Parent Relationship": "Outer",
          "Parallel Aware": false,
          "Join Type": "Inner",
          "Startup Cost": 66575.34,
          "Total Cost": 76861.82,
          "Plan Rows": 407,
          "Plan Width": 290,
          "Actual Startup Time": 49962.789,
          "Actual Total Time": 51206.643,
          "Actual Rows": 127117,
          "Actual Loops": 3,
          "Output": [ ... ],
...
"Execution Time": 52677.398

(полный план здесь .)

Actual Total Time * Actual Loops = 51 сек* 3 = 2 мин. 33 с явно превышает Execution Time из 52,7 с.

Правильно ли я понимаю документацию?

Если да, то не следует ли сказать: «мы потратили всего 0,01 миллисекунд при выполнении сканирования индекса на tenk2 "?

1 Ответ

0 голосов
/ 25 марта 2019

Ваш Hash Join находится под узлом Gather:

Gather (cost=67,575.34..77,959.52 rows=977 width=290) (actual time=51,264.085..52,595.474 rows=381,352 loops=1)
Buffers: shared hit=611279 read=99386
  -> Hash Join (cost=66,575.34..76,861.82 rows=407 width=290) (actual time=49,962.789..51,206.643 rows=127,117 loops=3)
     Buffers: shared hit=611279 read=99386

Это означает, что запрос запустил двух фоновых рабочих, которые выполнялись параллельно с основным бэкэндом для завершения хеш-соединения (см. "Workers Launched": 2 в плане выполнения).

Теперь очевидно, что если над задачей работают три процесса, общее время выполнения не будет суммой отдельных времен выполнения.

Другими словами, правило о умножении времени выполнения на количество циклов выполняется для соединения с вложенными циклами (однопоточное), но не для параллельного выполнения запроса.

...