PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak poprawić liczbę zapytań tekstowych dla Django za pomocą Postgres?

Jeśli opuścisz SearchRank i po prostu filtruj za pomocą zapytania, użyje indeksu GIN i wykona znacznie, znacznie szybciej:

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

Możesz dodać .explain() aby zakończyć, aby spojrzeć na zapytanie i sprawdzić, czy indeks jest używany:

print(entries.explain(analyze=True))

Powinieneś zobaczyć zapytanie za pomocą Bitmap Heap Scan, a czas wykonania powinien być znacznie szybszy.

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

Kiedy dodajesz adnotacje tak, jak powyżej, robisz adnotacje co Article obiekt - więc postgres postanawia wykonać Seq Scan (lub Parallel Seq Scan), który uzna za bardziej wydajny. Więcej informacji tutaj

Spróbuj dodać .explain(verbose=True) lub .explain(analyze=True) do początkowej metody SearchRank do porównania.

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

Sam mam do czynienia z tym problemem, z tabelą z 990k wpisów, która zajmuje ~10 sekund. Jeśli możesz przefiltrować zapytanie przed adnotacją przy użyciu innych pól – spowoduje to przesunięcie planowania zapytań z powrotem do korzystania z indeksu.

Od tej odpowiedzi




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL:jak ustawić search_path z wnętrza funkcji?

  2. Czy zapytania typu SELECT są jedynym typem, który można zagnieżdżać?

  3. Jak działa Extract() w PostgreSQL

  4. O wpływie całostronicowych zapisów

  5. Jak spłaszczyć wynik PostgreSQL