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)
Jusqu'à présent, ça va bien, je pars à la fois pour ce soir et nous verrons demain. Merci beaucoup! –
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
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