Zdá se, že zvýšením work_mem bylo řazení asi 8krát rychlejší:(172639.670 - 169311.063) / (167975.549 - 167570.669)
. Ale protože řazení zabralo jen malý zlomek celkového času provádění, ani 1000krát rychlejší nemůže věci celkově zlepšit. Je to seq scan, který zabírá čas.
Většinu času v seq skenování pravděpodobně strávíte na IO. Můžete to vidět spuštěním EXPLAIN (ANALYZE, BUFFERS)
po zapnutí track_io_timing.
Paralelizace sekvenčního skenování také často není příliš užitečná, protože IO systém je obvykle schopen dodat svou plnou kapacitu jedné čtečce kvůli kouzlu předčítání. A někdy si paralelní čtenáři mohou dokonce navzájem šlápnout na prsty, což celé představení zhoršuje. Paralelizaci můžete zakázat pomocí set max_parallel_workers_per_gather TO 0;
To by mohlo věci urychlit, a pokud ne, alespoň to usnadní pochopení plánu VYSVĚTLIT.
Načítáte více než 3 % tabulky:193963 / (193963 + 6041677)
. Indexy nemusí být příliš užitečné, když toho načítáte tolik. Pokud mají být, chtěli byste kombinovaný index, ne jednotlivé. Takže byste chtěli index na (client, event_name, date(datetime))
. Pak byste také museli změnit dotaz tak, aby používal date(datetime)
místo to_char(datetime, 'YYYY-MM-DD')
. Tuto změnu musíte provést, protože to_char není neměnný, a proto jej nelze indexovat.