sql >> Base de Datos >  >> RDS >> PostgreSQL

Parámetro de configuración work_mem en PostgreSQL en Linux

Publiqué su plan de consulta en Explain.depesz.com, eche un vistazo.

Las estimaciones del planificador de consultas son terriblemente incorrectas en algunos lugares. ¿Ha ejecutado ANALYZE? recientemente?

Lea los capítulos del manual sobre Estadísticas Utilizadas por el Planificador y Constantes de Costo del Planificador. Presta especial atención a los capítulos sobre random_page_cost y default_statistics_target .
Puede intentar:

ALTER TABLE diplomas ALTER COLUMN number SET STATISTICS 1000;
ANALYZE diplomas;

O vaya aún más alto para una mesa con 10 millones de filas. Depende de la distribución de datos y consultas reales . Experimento. El valor predeterminado es 100, el máximo es 10000.

Para una base de datos de ese tamaño, solo 1 o 5 MB de work_mem generalmente no son suficientes. Lea la página Wiki de Postgres sobre Tuning Postgres a la que @aleroot se vinculó.

Como su consulta necesita 430104kB de memoria en disco según EXPLAIN salida, debe establecer work_mem a algo así como 500 MB o más para permitir la clasificación en memoria. La representación de datos en memoria necesita algo más de espacio que la representación en disco. Es posible que le interese lo que Tom Lane publicó sobre ese asunto recientemente.

Aumento de work_mem con solo un poco, como lo intentaste, no ayudará mucho o incluso puede ralentizarse. Configurarlo en un nivel alto globalmente puede incluso doler, especialmente con el acceso simultáneo. Múltiples sesiones pueden privarse mutuamente de recursos. Asignar más para un propósito le quita memoria a otro si el recurso es limitado. La mejor configuración depende de la situación completa.

Para evitar efectos secundarios, solo configúrelo lo suficientemente alto localmente en su sesión y temporalmente para la consulta:

SET work_mem = '500MB';

Restablezca su valor predeterminado después:

RESET work_mem;

O use SET LOCAL para configurarlo solo para comenzar con la transacción actual.