sql >> Database teknologi >  >> RDS >> PostgreSQL

Sådan forbedres antallet af tekstforespørgsler til Django med Postgres

Hvis du dropper SearchRank og bare filtrer ved hjælp af forespørgslen, det vil bruge GIN-indekset og udføre meget, meget hurtigere:

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

Du kan tilføje .explain() for at afslutte for at tage et kig på forespørgslen og se om indekset er brugt:

print(entries.explain(analyze=True))

Du bør se forespørgslen ved hjælp af Bitmap Heap Scan, og udførelsestiden skulle være meget hurtigere.

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

Når du kommenterer, som du er ovenfor, kommenterer du hver Article objekt - så postgres beslutter at udføre en Seq Scan (eller Parallel Seq Scan), som den beslutter er mere effektiv. Mere info her

Prøv at tilføje .explain(verbose=True) eller .explain(analyze=True) til din oprindelige SearchRank-metode for at sammenligne.

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))

Jeg står selv over for dette problem med en tabel med 990.000 poster, der tager ~10 sekunder. Hvis du kan filtrere forespørgslen før annoteringen ved hjælp af andre felter - vil det skubbe forespørgselsplanlæggeren tilbage mod at bruge indekset.

Fra dette svar




  1. Hvordan kan jeg synkronisere to MySQL-tabeller, der har samme strukturer og forskellige servere

  2. python:oprette forbindelse til en Oracle-database ved hjælp af Oracles tegnebog/tnsnames

  3. SQL Self-join med datasammenligning for forskellige dage

  4. TABLESAMPLE returnerer forkert antal rækker?