J'essaie d'optimiser une requête lente générée par l'ORM de Django. C'est une requête plusieurs-à-plusieurs. Il faut plus d'une minute pour courir.Slow Postgres JOIN Query
Les tables ont une bonne quantité de données, mais ils ne sont pas énormes (400k lignes sp_article et 300k lignes sp_article_categories)
#categories.article_set.filter(post_count__lte=50)
EXPLAIN ANALYZE SELECT *
FROM "sp_article"
INNER JOIN "sp_article_categories" ON ("sp_article"."id" = "sp_article_categories"."article_id")
WHERE ("sp_article_categories"."category_id" = 1081
AND "sp_article"."post_count" <= 50)
Nested Loop (cost=0.00..6029.01 rows=656 width=741) (actual time=0.472..25.724 rows=1266 loops=1)
-> Index Scan using sp_article_categories_category_id on sp_article_categories (cost=0.00..848.82 rows=656 width=12) (actual time=0.015..1.305 rows=1408 loops=1)
Index Cond: (category_id = 1081)
-> Index Scan using sp_article_pkey on sp_article (cost=0.00..7.88 rows=1 width=729) (actual time=0.014..0.015 rows=1 loops=1408)
Index Cond: (sp_article.id = sp_article_categories.article_id)
Filter: (sp_article.post_count <= 50)
Total runtime: 26.536 ms
J'ai un index sur:
sp_article_categories.article_id (type: btree)
sp_article_categories.category_id
sp_article.post_count (type: btree)
Des suggestions sur comment je peux régler ceci pour obtenir la requête rapidement?
Merci!
exactement ce que vous avez réellement besoin de toutes les colonnes des deux tables dans l'ensemble de résultats? –
Je tire juste toutes les colonnes dans cet exemple.J'ai testé avec seulement un sous-ensemble des colonnes et a eu le même problème ... – erikcw
réduisant le nombre de colonnes avait peu d'effet? – philgo20