2010-10-11 34 views
11

Tôi có cơ sở dữ liệu CouchDB (v0.10.0) có kích thước 8.2 GB và chứa 3890000 tài liệu.Chế độ xem CouchDB cực kỳ chậm

Bây giờ, tôi có những điều sau đây là bản đồ của quan điểm

function(doc) {emit([doc.Status], doc); 

Và phải mất mãi mãi để tải (4 giờ và vẫn không có kết quả).

Dưới đây là một số thông tin bổ sung mà có thể giúp mô tả tình hình:

  1. Quan điểm không phải là một cái nhìn temp. Chế độ xem được xác định trước khi các tài liệu 3890000 được chèn.

  2. Không có gì trên máy chủ. Nó là một hộp ubuntu không có gì ngoài các cài đặt mặc định.

  3. Tôi thấy rằng CPU của mình đang di chuyển và hoạt động mạnh (đôi khi quay tới 100%). Bộ nhớ cũng đang di chuyển nhưng không tăng.

Vì vậy, câu hỏi của tôi là:

  1. thực sự là gì đang xảy ra trong nền?
  2. Đây có phải là điều "một lần" mà tôi phải chờ một lần và nó sẽ bằng cách nào đó hoạt động sau này?

Rất cám ơn,

Chí

Trả lời

13

xem chỉ được cập nhật lần sau họ đang đọc. Khi đọc, nó xử lý tất cả các tài liệu đã được cập nhật (được tạo, cập nhật, xóa) kể từ lần cuối cùng chế độ xem được đọc.

Vì vậy, ngay cả khi bạn đang xem được xác định trước khi chèn 3890000 tài liệu, nó sẽ xử lý 3890000 tài liệu cho chế độ xem.

Từ http://wiki.apache.org/couchdb/Introduction_to_CouchDB_views

Lưu ý rằng theo mặc định quan điểm không được tạo ra và cập nhật khi một tài liệu được lưu, nhưng đúng hơn, khi chúng được truy cập. Kết quả là, lần truy cập đầu tiên có thể mất một thời gian tùy thuộc vào kích thước dữ liệu của bạn trong khi CouchDB tạo ra khung nhìn. Nếu thích hợp hơn, các khung nhìn cũng có thể được cập nhật khi một tài liệu được lưu bằng cách sử dụng tập lệnh bên ngoài gọi các khung nhìn khi các bản cập nhật được thực hiện. Một ví dụ có thể được tìm thấy ở đây: RegeneratingViewsOnUpdate

Cũng chỉ đi qua mẹo này, mà có thể hữu ích nếu bạn đang chạy trên Ubuntu:

http://nosql.mypopescu.com/post/1299848121/couchdb-and-ubuntu-configuration-trick-for

+0

Hoàn hảo! Vì vậy, tôi đoán nó đang xây dựng chỉ mục tại thời điểm đó. Và ngay cả khi tôi khởi động lại nó sẽ không làm điều này (kể từ khi cập nhật được thực hiện). Cảm ơn Evan! –

14

Đừng phát ra toàn bộ doc. Nó không cần thiết. Thay vào đó, bạn có thể chạy truy vấn của mình với include_docs=true, điều này sẽ cho phép bạn truy cập tài liệu qua thuộc tính doc của mỗi hàng.

Khi bạn phát ra toàn bộ tài liệu, bạn tạo chỉ mục lớn hoặc lớn hơn toàn bộ cơ sở dữ liệu của mình.:)

+0

Mikeal là đúng, mặc dù tôi sẽ thêm vào trong một chủ đề khác JasonSmith đã đề cập rằng nếu bạn phát ra doc vào một chỉ mục, chỉ mục sẽ lớn hơn nhiều nhưng việc thu hồi sẽ nhanh hơn. Nhưng như Mikeal chỉ ra điều này sẽ làm cho các chỉ số của bạn về cơ bản kết thúc là bản sao của tập dữ liệu của bạn, vì vậy nếu bạn đang làm việc với dữ liệu BIG, đừng phát ra nó :) –

+0

Vậy làm thế nào để phát ra như thế? phát ra (doc.id)? –

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