2008-08-22 35 views
34

Từ thông tin nào tôi có thể tìm thấy, cả hai đều giải quyết cùng một vấn đề - nhiều hoạt động bí truyền hơn như ngăn chặn mảng và giao lộ (& &, @>, < @, v.v.). Tuy nhiên tôi sẽ quan tâm đến lời khuyên khi nào nên sử dụng cái này hay cái kia (hoặc không thể).
Các PostgreSQL documentation có một số thông tin về vấn đề này:PostgreSQL: chỉ mục GIN hoặc GiST?

  • index GIN tra cứu là nhanh hơn so với GIST
  • chỉ số GIN khoảng ba lần mất khoảng ba lần thời gian để xây dựng hơn GIST
  • chỉ số GIN là chậm hơn khoảng mười lần để cập nhật hơn GIST
  • chỉ số GIN là hai-to-ba lớn hơn GIST

lần Tuy nhiên tôi sẽ đặc biệt i nterested để biết nếu có một tác động hiệu suất khi bộ nhớ để chỉ số kích thước khẩu phần bắt đầu nhận được nhỏ (tức là. kích thước chỉ mục trở nên lớn hơn nhiều so với bộ nhớ có sẵn)? Tôi đã được thông báo trên kênh IRC#postgresql mà GIN cần giữ tất cả chỉ mục trong bộ nhớ, nếu không nó sẽ không hiệu quả, bởi vì, không giống như B-Tree, nó không biết phần nào cần đọc từ đĩa một truy vấn cụ thể? Câu hỏi đặt ra là: điều này có đúng không (bởi vì tôi cũng đã được nói ngược lại về điều này)? Liệu GiST có cùng hạn chế không? Có những hạn chế nào khác mà tôi nên biết khi sử dụng một trong các thuật toán lập chỉ mục này không?

+0

Các phép đo này thay đổi theo phiên bản PG bạn đang sử dụng. Tôi chỉ chạy thử nghiệm dưới 9.6.1 so với cột hstore và nhận được thông tin sau: GiST mất gấp 4,1 lần để xây dựng hơn GIN và chậm hơn khoảng 170 lần so với tra cứu. Thậm chí không gần với những con số bạn đã trích dẫn. – IamIC

Trả lời

14

Trước hết, bạn có cần sử dụng chúng để lập chỉ mục tìm kiếm văn bản không? GIN và GiST là chỉ mục chuyên biệt cho một số kiểu dữ liệu. Nếu bạn cần lập chỉ mục các giá trị char hoặc số nguyên đơn giản thì chỉ số B-Tree bình thường là tốt nhất.
Dù sao, tài liệu PostgreSQL có một chương trên GIST và một trên GIN, nơi bạn có thể tìm thêm thông tin.
Và, cuối cùng nhưng không kém phần quan trọng, cách tốt nhất để tìm ra điều tốt nhất là tạo dữ liệu mẫu (nhiều như bạn cần là một kịch bản thực) và sau đó tạo chỉ mục GIST, đo lượng thời gian cần thiết để tạo chỉ mục, chèn một giá trị mới, thực hiện truy vấn mẫu. Sau đó, thả chỉ mục và thực hiện tương tự với chỉ mục GIN. So sánh các giá trị và bạn sẽ có câu trả lời bạn cần, dựa trên dữ liệu của bạn.

+8

Có, nhưng vấn đề là thời gian, nó là khôn ngoan hơn để yêu cầu trong trường hợp ai đó đã biết ... –

+11

Tôi nghĩ rằng tạo ra bạn sở hữu dữ liệu là câu trả lời duy nhất. Tôi đã dành một vài ngày đọc tất cả những gì tôi có thể trong bối cảnh toàn văn và không gian về các chỉ mục gist và gin, chèn các chỉ mục vào hoặc tắt, các thiết lập wal trong postgres.sql và nói chuyện với mọi người trên # postgis/# postgresql và cuối cùng đến để kết luận rằng cách duy nhất để thực sự chắc chắn, cho việc sử dụng rất cụ thể của tôi, là tải các bảng thử nghiệm với các tập con lớn dữ liệu thực tế của tôi và kiểm tra. Nếu bạn vội vàng trong khi thiết lập để tiết kiệm một ngày ở đây hoặc ở đó, bạn sẽ kết thúc lãng phí tuần trong những năm tiếp theo, tôi đã học được bằng kinh nghiệm khó khăn. –

Các vấn đề liên quan