Die Auswahl der richtigen index für PostgreSQL query

Vereinfachte Tabelle:

CREATE TABLE products (
product_no integer PRIMARY KEY,
sales integer,
status varchar(16),
category varchar(16));

CREATE INDEX index_products_sales ON products (sales);
CREATE INDEX index_products_status ON products (status);
CREATE INDEX index_products_category ON products (category);

PostgreSQL version 8.4. Die Spalten 'status' und 'Kategorie'

Sind es 20 Millionen Produkte/Reihen, die sich auf 15 Kategorien.

Einer der am häufigsten verwendeten Abfragen wird, bekommen die drei am meisten verkauften Produkten, ausgenommen Produkte in den Kategorien 'cat3' und 'cat7':

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

Limit  (cost=0.00..8833.39 rows=3 width=12) (actual time=9235.332..9356.284 rows=3 loops=1)
   ->  Index Scan using index_products_sales on products  (cost=0.00..68935806.85 rows=23412 width=12) (actual time=9235.327..9356.278 rows=3 loops=1)
     Filter: (((category)::text <> ALL ('{cat3,cat7}'::text[])) AND ((status)::text = 'something'::text))

Was wäre der beste index für die Herstellung dieser speziellen Abfrage schneller laufen?

  • CREATE INDEX index_special AUF Produkte (status, sales DESC NULLS LAST), WO NICHT (Kategorie = 'cat3' and Kategorie = 'cat7');
  • Die WHERE Zustand der index ist logisch falsch, alle Zeilen zu qualifizieren, weil diese Art keine Zeile passen beide Kategorien gleichzeitig. Ich fügte hinzu, eine Antwort.
  • Du hast Recht, natürlich.
Schreibe einen Kommentar