es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Mejorar la consulta que utiliza Seq Scan utilizando índices.

Estoy tratando de optimizar esta consulta. Está realizando un escaneo secuencial, que crece de manera lineal con el número de filas.

SELECT "class"."starts_at"
FROM "class"
WHERE ("class"."starts_at" >= 2021-12-16 14:13:19.824533+00:00
       AND "class"."starts_at" BETWEEN 2021-12-01 00:00:00+05:00 AND 2021-12-31 23:59:59+05:00
       AND "class"."status" = 'reserved'
       AND "class"."teacher_id" = 3)

Plan de consulta: Escaneo secuencial en la tabla class (costo=0.00..1.18 filas=1 ancho=8) (tiempo real=0.029..0.056 filas=1 bucles=1)
Filtro: ((starts_at >= ‘2021-12-16 14:13:19.824533+00’::timestamp with time zone) AND (starts_at >= ‘2021-11-30 19:00:00+00’::timestamp with time zone) AND (starts_at <= ‘2021-12-31 18:59:59+00’::timestamp with time zone) AND ((status)::text = ‘reserved’::text) AND (teacher_id = 3))
Filas eliminadas por el filtro: 7
Tiempo de planificación: 0.138 ms
Tiempo de ejecución: 0.138 ms

Cuando agrego índice para starts_at, status y teacher, no se está utilizando el índice.

BEGIN;

Crear índice starts_at_status_teacher_idx en los campos starts_at, status y teacher del modelo class

CREATE INDEX "starts_at_status_teacher_idx" ON "class" ("starts_at", "status", "teacher_id");
COMMIT;

¿Qué índice debo agregar para que sea más rápido?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para hacer que la consulta se ejecute más rápido, podrías intentar crear un índice parcial en las columnas filtradas. Un índice parcial es un índice que solo incluye filas que cumplen cierta condición, en este caso las condiciones especificadas en la cláusula WHERE. Esto puede ayudar a reducir el tamaño del índice y hacerlo más selectivo, para que la base de datos pueda utilizarlo de manera más eficiente.

    Aquí tienes un ejemplo de cómo crear un índice parcial para esta consulta:

    CREATE INDEX starts_at_partial_idx ON class (starts_at)
    WHERE starts_at >= '2021-12-16 14:13:19.824533+00:00'
      AND starts_at BETWEEN '2021-12-01 00:00:00+05:00' AND '2021-12-31 23:59:59+05:00'
      AND status = 'reserved'
      AND teacher_id = 3;
    

    Este índice incluye solo las filas que coinciden con las condiciones de filtro en la cláusula WHERE, y debería permitir que la base de datos realice un escaneo solo de índices en lugar de un escaneo completo de la tabla, lo que debería ser más rápido.

    Ten en cuenta que es posible que debas ajustar la cláusula WHERE para que coincida con las condiciones específicas de tus datos y aplicación. También podrías considerar agregar columnas adicionales al índice para cubrir otras columnas en las cláusulas SELECT o WHERE, según las necesidades de tu aplicación.

Comments are closed.