Он использует параллельный план, поэтому он разделяет 20 000 000 строк тремя способами (один лидер плюс 2 работы). Однако данные делятся по блокам, а не по отдельным строкам, поэтому предполагаемое количество строк основано на множителе, предполагающем, что кто-то собирается получить их непропорционально большое количество.
На этапе объединения , он считает, что кортежи, которые, по его мнению, будут переданы рабочими, но (очевидно, я не копался в исходном коде для этого) не учитывают строки, которые, как ожидается, будет доставлен самим лидером.
Планы намного проще интерпретировать, если сначала отключить распараллеливание, set max_parallel_workers_per_gather TO 0;
. Если, конечно, вы не исследуете распараллеливание, конечно.