2011-01-18 3 views
1

Je vais avoir une très grande table avec des produits. J'ai besoin de sélectionner plusieurs produits à très fort décalage (exemple ci-dessous). Manuel Postgresql sur les index et les performances suggère de créer un index sur la colonne qui est utilisé par ORDER BY + conditions éventuelles. Tout est pêche, aucune sorte n'est utilisée. mais pour des valeurs de décalage élevées, LIMIT est très coûteux. Quelqu'un a-t-il une idée de ce qui pourrait être une cause à cela?Coût très élevé pour la limite inférieure LIMIT/high OFFSET

La requête suivante peut s'exécuter pendant quelques minutes.

Indexes: 
"product_slugs_pkey" PRIMARY KEY, btree (id) 
"index_for_listing_by_default_active" btree (priority DESC, name, active) 
"index_for_listing_by_name_active" btree (name, active) 
"index_for_listing_by_price_active" btree (master_price, active) 
"product_slugs_product_id" btree (product_id) 

EXPLAIN SELECT * FROM "product_slugs" WHERE ("product_slugs"."active" = 1) ORDER BY product_slugs.name ASC LIMIT 10 OFFSET 14859; 
                 QUERY PLAN               
------------------------------------------------------------------------------------------------------------------------- 
Limit (cost=26571.55..26589.43 rows=10 width=1433) 
    -> Index Scan using index_for_listing_by_name_active on product_slugs (cost=0.00..290770.61 rows=162601 width=1433) 
     Index Cond: (active = 1) 
(3 rows) 

Répondre

5

Le vous ici ne va pas aider beaucoup index_for_listing_by_name_active indice, étant donné que les produits dans l'ensemble de résultats ne vont pas nécessairement être contigus dans l'index. Essayez de créer un index conditionnel par nom uniquement sur les produits qui sont actifs:

CREATE INDEX index_for_listing_active_by_name 
    ON product_slugs (name) 
    WHERE product_slugs.active = 1; 
+0

Jusqu'à présent, ça va bien, je pars à la fois pour ce soir et nous verrons demain. Merci beaucoup! –

+1

agréable de voir quelqu'un se souvenir des indices conditionnels existent au lieu de simplement dire de changer l'ordre des colonnes d'index :) – araqnid

+0

J'ai essayé d'échanger l'ordre des colonnes dans une base de données de test et il n'a pas semblé aider - en fait, il a fait pire . Je ne suis pas sûr de l'histoire, mais je m'attendais à ce que ça aide. – pmdboi

Questions connexes