sql >> Database >  >> RDS >> PostgreSQL

Hoe u het aantal tekstquery's voor Django kunt verbeteren met Postgres

Als u de SearchRank . laat vallen en filter gewoon met behulp van de zoekopdracht, het zal de GIN-index gebruiken en veel, veel sneller presteren:

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

U kunt .explain() toevoegen om te eindigen om de zoekopdracht te bekijken en te zien of de index wordt gebruikt:

print(entries.explain(analyze=True))

U zou de query moeten zien met Bitmap Heap Scan en de uitvoeringstijd zou veel sneller moeten zijn.

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

Wanneer u annoteert zoals hierboven, annoteert u elke Article object - dus postgres besluit een Seq Scan (of Parallel Seq Scan) uit te voeren waarvan het besluit dat het efficiënter is. Meer info hier

Probeer .explain(verbose=True) . toe te voegen of .explain(analyze=True) naar uw oorspronkelijke SearchRank-methode om te vergelijken.

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

Ik heb zelf met dit probleem te maken, met een tabel met 990k-items die ~ 10 seconden duurt. Als u de query vóór de annotatie kunt filteren met andere velden, zal de queryplanner teruggaan naar het gebruik van de Index.

Van dit antwoord




  1. Verificatiemethode 'caching_sha2_password' wordt niet ondersteund door een van de beschikbare plug-ins

  2. FOUT 1114 (HY000):De tabel 'XXX' is vol

  3. Macports mysql5 instellen onder Snow Leopard

  4. Reeks vervangen door willekeurig getal