2009-02-27 9 views
6

Tengo una consulta en mi aplicación que se ejecuta muy rápido cuando hay una gran cantidad de filas en mis tablas. Pero cuando el número de filas es de tamaño moderado (ni grande ni pequeño), la misma consulta se ejecuta hasta 15 veces más despacio.¿Cuáles son los inconvenientes de configurar enable_nestloop en OFF

El plan de explicación muestra que la consulta en un conjunto de datos de tamaño mediano usa bucles anidados para su algoritmo de unión. El conjunto de datos grande usa hash joins.

Puedo desalentar al planificador de consultas de usar bucles anidados en el nivel de la base de datos (postgresql.conf) o por sesión (SET enable_nestloop TO off).

¿Cuáles son los peligros potenciales de set enable_nestloop to off?

Otra información: PostgreSQL 8.2.6, ejecutándose en Windows.

Respuesta

7

¿Cuáles son las posibles dificultades del ajuste enable_nestloop al off?

Esto significa que nunca podrá usar los índices de manera eficiente.

Y parece que no los usa ahora.

La consulta como esta:

SELECT u.name, p.name 
FROM users u 
JOIN profiles p ON p.id = u.profile_id 
WHERE u.id = :id 

muy probablemente utilizará NESTED LOOPS con un en user.id y un en profile.id, a condición de que usted ha construido índices en estos campos.

Las consultas con filtros de baja selectividad (es decir, las consultas que necesitan más de 10% de datos de las tablas que utilizan) se beneficiarán de MERGE JOINS y HASH JOINS.

Pero las consultas como la anterior requieren NESTED LOOPS para funcionar de manera eficiente.

Si publica sus consultas y definiciones de tabla aquí, probablemente se pueda hacer mucho sobre el rendimiento de índices y consultas.

4

Un par de cosas a tener en cuenta antes de tomar medidas tan drásticas:

  • actualizar la instalación de la última versión 8.2.x (que en este momento es 8.2.12). Aún mejor: considere actualizarse a la siguiente versión estable que es 8.3 (8.3.6).

  • considere cambiar su plataforma de producción a algo que no sea Windows. El puerto de Windows de PostgreSQL, aunque es muy útil para fines de desarrollo, aún no está a la par con los Un * x.

  • lea el primer párrafo de "Planner Method Configuration". Este wiki page probablemente también ayudará.

1

Tengo exactamente la misma experiencia. Algunas consultas en una gran base de datos se ejecutaron usando bucles anidados y eso tomó 12 horas.cuando se ejecuta en 30 segundos cuando se desactivan los bucles anidados o se eliminan los índices.

Tener consejos serían muy agradable aquí, pero intentado

... 
SET ENABLE_NESTLOOP TO FALSE; 
... critical query 
SET ENABLE_NESTLOOP TO TRUE; 
... 

para tratar este asunto. Así que definitivamente puede desactivar y volver a habilitar el uso de bucle anidado, y no puede discutir con un aumento de velocidad de 9000 veces :)

Un problema que tengo es hacer el cambio de ENABLE_NESTLOOP en un procedimiento PgSQL/PL. Puedo ejecutar un script SQL en Aqua Data Studio haciendo las cosas bien, pero cuando lo pongo en un procedimiento PgSQL/PL, aún me lleva 12 horas. Aparentemente estaba ignorando el cambio.

Cuestiones relacionadas