PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как да подобрим броя на текстовите заявки за Django с Postgres

Ако изпуснете SearchRank и просто филтрирайте с помощта на заявката, тя ще използва GIN индекса и ще работи много, много по-бързо:

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

Можете да добавите .explain() за да завършите, за да разгледате заявката и да видите дали се използва индексът:

print(entries.explain(analyze=True))

Трябва да видите заявката, използваща Bitmap Heap Scan и времето за изпълнение трябва да е много по-бързо.

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

Когато правите анотации, както сте по-горе, вие анотирате всеки Article обект - така че postgres решава да извърши Seq Scan (или Parallel Seq Scan), което реши, че е по-ефективно. Повече информация тук

Опитайте да добавите .explain(verbose=True) или .explain(analyze=True) към вашия първоначален метод SearchRank за сравнение.

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

Аз самият се сблъсквам с този проблем, с таблица с 990k записа, която отнема ~10 секунди. Ако можете да филтрирате заявката преди пояснението с помощта на други полета - това ще тласне планировчика на заявки обратно към използването на индекса.

От този отговор




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да тествам моя ad-hoc SQL с параметри в прозореца за заявка на Postgres

  2. Логическа репликация на PostgreSQL

  3. Всички групи имат ли еднаква обща мощност за дадена подгрупа?

  4. Заявката за избор с ограничение за отместване е твърде бавна

  5. Актуализациите на полето JSON не се запазват в DB