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

SELECT DISTINCT es más lento de lo esperado en mi tabla en PostgreSQL

Si bien no hay escaneo de omisión de índice en Postgres todavía, emularlo:

WITH RECURSIVE cte AS (
   (   -- parentheses required
   SELECT product_id
   FROM   tickers
   ORDER  BY 1
   LIMIT  1
   )
   UNION ALL
   SELECT l.*
   FROM   cte c
   CROSS  JOIN LATERAL (
      SELECT product_id
      FROM   tickers t
      WHERE  t.product_id > c.product_id  -- lateral reference
      ORDER  BY 1
      LIMIT  1
      ) l
   )
TABLE  cte;

Con un índice en (product_id) y solo 40 ID de producto únicos en la tabla esto debería ser Rápido . Con F mayúscula .
El índice PK en (product_id, trade_id) ¡también es bueno para eso!

Con muy pocas filas por product_id (lo opuesto a su distribución de datos), DISTINCT / DISTINCT ON sería tan rápido o más rápido.

El trabajo para implementar escaneos de omisión de índice está en curso.
Ver:

  • ¿Seleccionar la primera fila en cada grupo GROUP BY?
  • Optimizar la consulta GROUP BY para recuperar la fila más reciente por usuario
  • ¿Un índice compuesto también es bueno para consultas en el primer campo?