PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

So verbessern Sie die Anzahl der Textabfragen für Django mit Postgres

Wenn Sie den SearchRank fallen lassen und filtern Sie einfach mit der Abfrage, es wird der GIN-Index verwendet und viel, viel schneller ausgeführt:

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

Sie können .explain() hinzufügen zum Ende, um einen Blick auf die Abfrage zu werfen und zu sehen, ob der Index verwendet wird:

print(entries.explain(analyze=True))

Sie sollten die Abfrage mit Bitmap Heap Scan sehen und die Ausführungszeit sollte viel schneller sein.

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

Wenn Sie wie oben kommentieren, kommentieren Sie alle Article Objekt - also beschließt Postgres, einen Seq-Scan (oder parallelen Seq-Scan) durchzuführen, der seiner Meinung nach effizienter ist. Weitere Informationen finden Sie hier

Versuchen Sie, .explain(verbose=True) hinzuzufügen oder .explain(analyze=True) mit Ihrer anfänglichen SearchRank-Methode vergleichen.

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

Ich stehe selbst vor diesem Problem, mit einer Tabelle mit 990.000 Einträgen, die ~ 10 Sekunden dauert. Wenn Sie die Abfrage vor der Anmerkung filtern können, indem Sie andere Felder verwenden, wird der Abfrageplaner zurück zur Verwendung des Index gedrängt.

Aus dieser Antwort