PostgreSQL: как читать анализ параллельного объяснения (строки не совпадают с одним потоком) - PullRequest
1 голос
/ 27 сентября 2019

Я объединяю две таблицы: главную (ui_cdc_s5_misto_cas_zdroj_aggregace) индексированную таблицу и зависимую таблицу (ui_cdc_s5_misto_cas_zdroj_aggregace_zdrobneni) через идентификатор, зависимая таблица имеет 9 131 407 строк.ожидается, что он применяет сканирование индекса к основной таблице и получит 4042 строки, для зависимой таблицы он применяет сканирование seq, берет все 9 131 407 строк и выполняет хеш-соединение.

enter image description here

Объясните анализ непараллельно: https://explain.depesz.com/s/5xjm

Тогда, если я разрешу параллельную обработку, число строк для зависимой таблицы не совпадет, если я суммирую все фактические строки, которые я получу в 8 602 360Также не совпадают строки в основной таблице.
ПРИМЕЧАНИЕ: эти цифры, похоже, меняются при каждом выполнении.

->  Parallel Seq Scan on reports.ui_cdc_s5_misto_cas_zdroj_aggregace_zdrobneni az  (cost=0.00..87618.15 rows=2945615 width=24) (actual time=0.035..939.911 rows=3043802 loops=3)
      Output: az.id, az.zahranicni, az.pul_den, az.v_vytizeni
      Buffers: shared hit=58162
      Worker 0: actual time=0.027..1149.377 rows=2835236 loops=1
        Buffers: shared hit=18059
      Worker 1: actual time=0.050..1191.181 rows=2723322 loops=1
       Buffers: shared hit=17346

Объясните, проанализируйте параллель: https://explain.depesz.com/s/1HHN

Почему число не совпадает, потому что оно действительно не читает всю таблицу (мне кажется маловероятным), или есть некоторыедругая логика в этом?

PostgreSQL 11.5 на x86_64-pc-linux-gnu, скомпилированный gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-36), 64-битный

1 Ответ

1 голос
/ 27 сентября 2019

Я допускаю, что это сбивает с толку.

Соответствующая линия в параллельном плане - первая:

rows=3043802 loops=3

Число строк - среднее, поэтому это третьфактические строки (сравните с непараллельным планом).

Это делается для того, чтобы вы получили правильный номер, выполнив обычную операцию умножения данных на число циклов.

другие строки содержат информацию о количестве строк, внесенных рабочими процессами в общий итог.Поскольку это информация только об одном процессе (loops=1), число не делится.

Таким образом, в этом случае мы можем сделать вывод, что процесс-лидер внес в результат больше строк, чем рабочие процессы.

...