sql >> Databasteknik >  >> RDS >> PostgreSQL

SELECT DISTINCT är långsammare än förväntat på mitt bord i PostgreSQL

Även om det inte finns någon indexöverhoppningsskanning i Postgres ännu, emulera den:

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;

Med ett index på (product_id) och endast 40 unika produkt-ID:n i tabellen det här ska vara snabbt . Med stort F .
PK-indexet på (product_id, trade_id) är bra för det också!

Med endast väldigt få rader per product_id (motsatsen till din datadistribution), DISTINCT / DISTINCT ON skulle vara lika snabb eller snabbare.

Arbetet med att implementera indexhoppningsskanningar pågår.
Se:

  • Välj första raden i varje GROUP BY-grupp?
  • Optimera GROUP BY-frågan för att hämta den senaste raden per användare
  • Är ett sammansatt index också bra för frågor i det första fältet?



  1. Automatisera tabellmodellbearbetningen av Analysis Services-databaser (SSAS) i SQL Server

  2. När ska jag använda CROSS APPLY över INNER JOIN?

  3. GreenDAO stöder flera relationer mellan tabeller

  4. Hur LOAD_FILE() fungerar i MariaDB