Jeg lagde din forespørgselsplan op på explain.depesz.com, se.
Forespørgselsplanlæggerens estimater er frygtelig forkerte nogle steder. Har du kørt ANALYZE
for nylig?
Læs kapitlerne i manualen om statistik, der bruges af planlæggeren og planlæggerens omkostningskonstanter. Vær særlig opmærksom på kapitlerne om random_page_cost
og default_statistics_target
.
Du kan prøve:
ALTER TABLE diplomas ALTER COLUMN number SET STATISTICS 1000;
ANALYZE diplomas;
Eller gå endnu højere for en tabel med 10M rækker. Det afhænger af datadistribution og faktiske forespørgsler . Eksperiment. Standard er 100, maksimum er 10.000.
For en database af den størrelse, kun 1 eller 5 MB work_mem
er generelt ikke nok. Læs Postgres Wiki-siden på Tuning Postgres, som @aleroot linkede til.
Da din forespørgsel har brug for 430104kB hukommelse på disken i henhold til EXPLAIN
output, skal du indstille work_mem
til noget som 500 MB eller mere for at tillade sortering i hukommelsen. In-memory repræsentation af data kræver noget mere plads end on-disk repræsentation. Du kan være interesseret i, hvad Tom Lane skrev om den sag for nylig.
Øger work_mem
med bare lidt, som du prøvede, hjælper det ikke meget eller kan endda bremse. At sætte den til høj globalt kan endda gøre ondt, især med samtidig adgang. Flere sessioner kan sulte hinanden efter ressourcer. At allokere mere til ét formål fjerner hukommelse fra et andet, hvis ressourcen er begrænset. Den bedste opsætning afhænger af hele situationen.
For at undgå bivirkninger skal du kun indstille det højt nok lokalt i din session og midlertidigt til forespørgslen:
SET work_mem = '500MB';
Nulstil den til din standard bagefter:
RESET work_mem;
Eller brug SET LOCAL
for at indstille det kun til den aktuelle transaktion til at begynde med.