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

¿Qué me dice exactamente PostgreSQL?

La parte que siempre encontré confusa es el costo inicial frente al costo total. Busco esto en Google cada vez que lo olvido, lo que me trae de vuelta aquí, lo que no explica la diferencia, por eso escribo esta respuesta. Esto es lo que he obtenido de Postgres EXPLAIN documentación, explicada tal como la entiendo.

Aquí hay un ejemplo de una aplicación que administra un foro:

EXPLAIN SELECT * FROM post LIMIT 50;

Limit  (cost=0.00..3.39 rows=50 width=422)
  ->  Seq Scan on post  (cost=0.00..15629.12 rows=230412 width=422)

Aquí está la explicación gráfica de PgAdmin:

(Cuando usa PgAdmin, puede apuntar con el mouse a un componente para leer los detalles del costo).

El costo se representa como una tupla, p. el costo del LIMIT es cost=0.00..3.39 y el costo de escanear secuencialmente post es cost=0.00..15629.12 . El primer número de la tupla es el coste inicial y el segundo número es el costo total . Porque usé EXPLAIN y no EXPLAIN ANALYZE , estos costos son estimaciones, no medidas reales.

  • Coste inicial es un concepto complicado. No solo representa la cantidad de tiempo antes de que ese componente comience . Representa la cantidad de tiempo entre el momento en que el componente comienza a ejecutarse (lectura de datos) y el momento en que el componente genera su primera fila .
  • Coste total es todo el tiempo de ejecución del componente, desde que comienza a leer los datos hasta que termina de escribir su salida.

Como complicación, los costos de cada nodo "principal" incluyen los costos de sus nodos secundarios. En la representación de texto, el árbol se representa mediante sangría, p. LIMIT es un nodo padre y Seq Scan es su hijo. En la representación de PgAdmin, las flechas apuntan de secundario a principal (la dirección del flujo de datos), lo que puede resultar contradictorio si está familiarizado con la teoría de grafos.

La documentación dice que los costos incluyen todos los nodos secundarios, pero tenga en cuenta que el costo total del padre 3.39 es mucho menor que el costo total de su hijo 15629.12 . El costo total no es inclusivo porque un componente como LIMIT no necesita procesar toda su entrada. Consulte EXPLAIN SELECT * FROM tenk1 WHERE unique1 < 100 AND unique2 > 9000 LIMIT 2; ejemplo en Postgres EXPLAIN documentación.

En el ejemplo anterior, el tiempo de inicio es cero para ambos componentes, porque ninguno de los componentes necesita realizar ningún procesamiento antes de comenzar a escribir filas:un escaneo secuencial lee la primera fila de la tabla y la emite. El LIMIT lee su primera fila y luego la emite.

¿Cuándo necesitaría un componente hacer mucho procesamiento antes de que pueda comenzar a generar filas? Hay muchas razones posibles, pero veamos un ejemplo claro. Aquí está la misma consulta de antes, pero ahora contiene un ORDER BY cláusula:

EXPLAIN SELECT * FROM post ORDER BY body LIMIT 50;

Limit  (cost=23283.24..23283.37 rows=50 width=422)
  ->  Sort  (cost=23283.24..23859.27 rows=230412 width=422)
        Sort Key: body
        ->  Seq Scan on post  (cost=0.00..15629.12 rows=230412 width=422)

Y gráficamente:

Una vez más, el escaneo secuencial en post no tiene costo de inicio:comienza a generar filas inmediatamente. Pero el tipo tiene un costo inicial significativo 23283.24 porque tiene que ordenar toda la tabla antes de que pueda generar una sola fila . El costo total del género 23859.27 es solo un poco más alto que el costo inicial, lo que refleja el hecho de que una vez que se ha ordenado todo el conjunto de datos, los datos ordenados se pueden emitir muy rápidamente.

Tenga en cuenta que el tiempo de inicio del LIMIT 23283.24 es exactamente igual al tiempo de inicio del tipo. Esto no es porque LIMIT en sí mismo tiene un tiempo de inicio alto. En realidad, tiene cero tiempo de inicio por sí mismo, pero EXPLAIN acumula todos los costos secundarios para cada padre, por lo que el LIMIT el tiempo de inicio incluye la suma de los tiempos de inicio de sus hijos.

Este resumen de costos puede dificultar la comprensión del costo de ejecución de cada componente individual. Por ejemplo, nuestro LIMIT tiene cero tiempo de inicio, pero eso no es obvio a primera vista. Por esta razón, varias otras personas se vincularon a Explain.depesz.com, una herramienta creada por Hubert Lubaczewski (también conocido como depesz) que ayuda a comprender EXPLAIN entre otras cosas, restando los costos de los hijos de los costos de los padres. Menciona algunas otras complejidades en una breve publicación de blog sobre su herramienta.