sql >> Databasteknik >  >> RDS >> PostgreSQL

Att välja rätt index för PostgreSQL-fråga

Skapa ett partiellt index med flera kolumner med denna speciella sorteringsordning:

CREATE INDEX products_status_sales_partial_idx ON products (status, sales DESC)
WHERE  category NOT IN ('cat3','cat7');

Ändra din fråga något:

SELECT product_no, sales 
FROM   products 
WHERE  status = 'something'
AND    category NOT IN ('cat3', 'cat7') 
ORDER  BY status, sales DESC 
LIMIT  3;

Lägger till status som första element i ORDER BY klausul verkar överflödig och meningslös. Men ge det ett försök.

Varför?

Frågeplaneraren är inte smart nog att förstå, det där med

WHERE  status = 'something' ...
ORDER  BY sales DESC

sorteringsordningen för indexet (status, sales DESC) matchar som en logisk konsekvens. Så den kommer att läsa alla kvalificerande rader, sortera och välj de 3 bästa.

Genom att lägga till status till ORDER BY du gör det möjligt för frågeplaneraren att läsa de tre bästa posterna från indexet direkt. Räkna med en snabbare ökning med flera storleksordningar .

Testad med PostgreSQL 8.4 och 9.1.



  1. mysql 12 timmar till 24 timmars tidskonvertering

  2. välj de två senaste raderna för varje användare för att få skillnaden för en kolumn (MySQL)

  3. Hur man returnerar alla otillförlitliga utländska nyckelbegränsningar i SQL Server (T-SQL-exempel)

  4. Infoga en lista<> i SQL Server-tabellen