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

Chỉ mục GIN của PostgreSQL chậm hơn GIST cho pg_trgm?

Một số vấn đề nổi bật:

Trước tiên, hãy xem xét nâng cấp lên phiên bản Postgres hiện tại . Tại thời điểm viết bài, đó là trang 9.6 hoặc trang 10 (hiện đang là phiên bản beta). Kể từ trang 9.4, đã có nhiều cải tiến cho chỉ mục GIN, mô-đun bổ sung pg_trgm và dữ liệu lớn nói chung.

Tiếp theo, bạn cần thêm nhiều RAM , cụ thể là work_mem cao hơn cài đặt. Tôi có thể biết từ dòng này trong EXPLAIN đầu ra:

Heap Blocks: exact=7625 lossy=223807

"mất mát" thông tin chi tiết về Quét đống bitmap (với các con số cụ thể của bạn) cho thấy sự thiếu hụt đáng kể work_mem . Postgres chỉ thu thập địa chỉ khối trong quá trình quét chỉ mục bitmap thay vì con trỏ hàng vì điều đó dự kiến ​​sẽ nhanh hơn với work_mem thấp của bạn cài đặt (không thể giữ địa chỉ chính xác trong RAM). Nhiều hàng không đủ điều kiện khác phải được lọc trong Quét đống bitmap sau cách này. Câu trả lời liên quan này có chi tiết:

Nhưng không đặt work_mem quá cao mà không xem xét toàn bộ tình hình:

Có thể có các vấn đề khác, chẳng hạn như chỉ mục hoặc bảng cồng kềnh hoặc nhiều nút cổ chai về cấu hình. Nhưng nếu bạn chỉ sửa hai mục này, truy vấn sẽ nhiều nhanh hơn rồi.

Ngoài ra, bạn có thực sự cần truy xuất tất cả 40k hàng trong ví dụ này không? Bạn có thể muốn thêm một LIMIT nhỏ vào truy vấn và đặt nó thành tìm kiếm "láng giềng gần nhất" - trong trường hợp đó, chỉ mục GiST là lựa chọn tốt hơn sau cùng, bởi vì that được cho là nhanh hơn với chỉ số GiST. Ví dụ:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tính trung bình từ cột JSON

  2. Mã hóa ký tự (UTF-8) trong phiên PowerShell

  3. Khi nào tên cột hoặc bảng Postgres cần dấu ngoặc kép và khi nào thì không?

  4. Google Cloud SQL - Bộ nhớ Postgresql tiếp tục tăng

  5. SAU KHI LOGON (Oracle) kích hoạt trong PostgreSQL với phần mở rộng - login_hook