sql >> Databáze >  >> RDS >> PostgreSQL

Výběr správného indexu pro dotaz PostgreSQL

Vytvořte částečný, vícesloupcový index s tímto konkrétním pořadím řazení:

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

Mírně svůj dotaz upravte:

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

Přidání status jako první prvek ORDER BY klauzule se zdá nadbytečná a nesmyslná. Ale zkuste to.

Proč?

Plánovač dotazů není dostatečně chytrý, aby pochopil, že s

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

pořadí řazení indexu (status, sales DESC) shoduje se jako logický důsledek. Takže to bude číst vše kvalifikační řádky, seřaďte a vyberte 3 nejlepší.

Přidáním status do ORDER BY povolíte plánovači dotazů číst 3 hlavní položky z indexu přímo. Očekávejte zrychlení o několik řádů .

Testováno s PostgreSQL 8.4 a 9.1.



  1. java.sql.SQLException:ORA-01652:nelze rozšířit dočasný segment o 128 v tabulkovém prostoru TEMP (i po rozšíření)

  2. Jak předat pole do uložené procedury serveru SQL Server

  3. Propojit aws ec2 mysql s mojí místní aplikací Java

  4. Nelze předat hodnotu řetězce 1,2 jako vstup do dotazu Oracle