Es importante comprender el código de forma correcta previamente a adaptarlo a tu proyecto si ttienes algo que aportar puedes comentarlo.
Solución:
Puede evitar este problema agregando un innecesario ORDER BY
cláusula a la consulta.
SELECT * FROM object_values WHERE (objectID = 53708) ORDER BY timestamp, objectID DESC limit 1;
Se está encontrando con un problema que se relaciona, creo, con la falta de estadísticas sobre las correlaciones de filas. Considere reportarlo a pg-bugs como referencia si está usando la última versión de Postgres.
La interpretación que sugeriría para sus planes es:
-
limit 1
hace que Postgres busque una sola fila y, al hacerlo, asume que su object_id es lo suficientemente común como para que aparezca razonablemente rápido en un escaneo de índice.Según las estadísticas que le dio, su pensamiento probablemente sea que necesitará leer ~ 70 filas en promedio para encontrar una fila que se ajuste; simplemente no se da cuenta de que object_id y timestamp se correlacionan con el punto en el que realmente va a leer una gran parte de la tabla.
-
limit 3
por el contrario, hace que se dé cuenta de que es bastante poco común, por lo que considera seriamente (y termina…) clasificando top-n las 1700 filas esperadas con elobject_id
quiere, porque es probable que hacerlo sea más barato.Por ejemplo, podría saber que la distribución de estas filas es para que estén todas empaquetadas en la misma área del disco.
-
no
limit
cláusula significa que obtendrá el 1700 de todos modos, por lo que va directamente al índice enobject_id
.
Solución, por cierto: agregue un índice en (object_id, timestamp)
o (object_id, timestamp desc)
.
Empecé a tener síntomas similares en una tabla con muchas actualizaciones y lo que necesitaba en mi caso era
analyze $table_name;
En este caso, era necesario actualizar las estadísticas, lo que solucionó los planes de consulta lentos que se estaban produciendo.
Documentos de apoyo: https://www.postgresql.org/docs/current/sql-analyze.html
Te mostramos reseñas y valoraciones
Recuerda que te concedemos agregar una reseña si te fue útil.