sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur man förbättrar antalet textfrågor för Django med Postgres

Om du tappar SearchRank och bara filtrera med hjälp av frågan så kommer det att använda GIN-indexet och prestera mycket, mycket snabbare:

query = SearchQuery(termo,config='portuguese')
entries = Article.objects.filter(search_vector=query)

Du kan lägga till .explain() för att avsluta för att ta en titt på frågan och se om indexet används:

print(entries.explain(analyze=True))

Du bör se frågan med Bitmap Heap Scan och exekveringstiden bör vara mycket snabbare.

Bitmap Heap Scan on your_table
...
Planning Time: 0.176 ms Execution Time: 0.453 ms

När du kommenterar som du är ovan, kommenterar du varje Article objekt - så postgres bestämmer sig för att utföra en Seq Scan (eller Parallel Seq Scan) som den bestämmer är mer effektiv. Mer information här

Testa att lägga till .explain(verbose=True) eller .explain(analyze=True) till din ursprungliga sökrankningsmetod för att jämföra.

query = SearchQuery(termo,config='portuguese')
search_rank = SearchRank(F('search_vector'), query)
entries = Article.objects.annotate(rank=search_rank).filter(search_vector=query).order_by('-rank')

print(entries.explain(analyze=True))

Jag står själv inför det här problemet, med en tabell med 990 000 poster som tar ~10 sekunder. Om du kan filtrera frågan före anteckningen med andra fält - kommer det att skjuta frågeplaneraren tillbaka mot att använda indexet.

Från det här svaret




  1. Oracle:Hur bestämmer jag det NYA namnet på ett objekt i en AFTER ALTER-utlösare?

  2. MySQL - Hur man visar radvärde som kolumnnamn med hjälp av concat och group_concat

  3. Hur gör man en snabbare fråga med störst-n-per-grupp?

  4. mysql kommandoraden returnerar körningstid?