PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

SELECT DISTINCT ist auf meiner Tabelle in PostgreSQL langsamer als erwartet

Obwohl es in Postgres noch keinen Index-Skip-Scan gibt, emulieren Sie ihn:

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;

Mit einem Index auf (product_id) und nur 40 eindeutige Produkt-IDs in der Tabelle das sollte Schnell sein . Mit großem F .
Der PK-Index auf (product_id, trade_id) ist auch gut dafür!

Mit nur sehr wenigen Zeilen pro product_id (das Gegenteil Ihrer Datenverteilung), DISTINCT / DISTINCT ON wäre genauso schnell oder schneller.

Die Arbeit an der Implementierung von Index-Skip-Scans ist im Gange.
Siehe:

  • Erste Zeile in jeder GROUP BY-Gruppe auswählen?
  • Optimieren Sie die GROUP BY-Abfrage, um die neueste Zeile pro Benutzer abzurufen
  • Ist ein zusammengesetzter Index auch gut für Abfragen im ersten Feld?