PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Cách cải thiện số lượng truy vấn văn bản cho Django với Postgres

Nếu bạn đánh rơi SearchRank và chỉ cần lọc bằng cách sử dụng truy vấn, nó sẽ sử dụng chỉ mục GIN và hoạt động nhanh hơn nhiều:

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

Bạn có thể thêm .explain() kết thúc để xem truy vấn và xem chỉ mục có được sử dụng hay không:

print(entries.explain(analyze=True))

Bạn sẽ thấy truy vấn bằng cách sử dụng Bitmap Heap Scan và Thời gian thực thi sẽ nhanh hơn nhiều.

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

Khi bạn chú thích như bạn ở trên, bạn đang chú thích mọi Article đối tượng - vì vậy postgres quyết định thực hiện Seq Scan (hoặc Parallel Seq Scan) mà nó quyết định là hiệu quả hơn. Thông tin thêm tại đây

Thử thêm .explain(verbose=True) hoặc .explain(analyze=True) với phương pháp SearchRank ban đầu của bạn để so sánh.

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

Tôi đang tự mình đối mặt với vấn đề này, với một bảng có 990 nghìn mục nhập mất ~ 10 giây. Nếu bạn có thể lọc truy vấn trước chú thích bằng cách sử dụng bất kỳ trường nào khác - nó sẽ đẩy người lập kế hoạch truy vấn trở lại sử dụng Chỉ mục.

Từ câu trả lời này




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để SAO CHÉP NHẬP tệp json vào postgres?

  2. Tên bảng động trong postgreSQL 9.3

  3. Ngày hội nhà phát triển PostgreSQL ở Praha 2016

  4. Theo dõi cơ sở dữ liệu bên ngoài từ Heroku

  5. UUID hợp lệ không phải là UUID hợp lệ