Vì vậy, tôi đã thực hiện một số thử nghiệm với sqlite cho các tệp rất lớn và đưa ra một số kết luận (ít nhất là cho ứng dụng cụ thể của tôi).
Các thử nghiệm liên quan đến một tệp sqlite duy nhất với một bảng hoặc nhiều bảng. Mỗi bảng có khoảng 8 cột, hầu hết tất cả các số nguyên và 4 chỉ số.
Ý tưởng là chèn đủ dữ liệu cho đến khi các tệp sqlite có dung lượng khoảng 50 GB.
Bảng đơn
Tôi đã cố gắng chèn nhiều hàng vào một tệp sqlite chỉ bằng một bảng. Khi tệp có dung lượng khoảng 7 GB (xin lỗi, tôi không thể nói cụ thể về số lượng hàng), quá trình chèn đã mất quá nhiều thời gian. Tôi đã ước tính rằng thử nghiệm của tôi để chèn tất cả dữ liệu của tôi sẽ mất 24 giờ hoặc lâu hơn, nhưng nó đã không hoàn thành ngay cả sau 48 giờ.
Điều này dẫn đến tôi kết luận rằng một bảng sqlite duy nhất, rất lớn sẽ có vấn đề với các phần chèn thêm, và có lẽ các hoạt động khác cũng vậy.
Tôi đoán điều này không có gì đáng ngạc nhiên, vì bảng trở nên lớn hơn, việc chèn và cập nhật tất cả các chỉ số mất nhiều thời gian hơn.
Nhiều bàn
Sau đó tôi đã thử chia dữ liệu theo thời gian qua nhiều bảng, một bảng mỗi ngày. Dữ liệu cho 1 bảng gốc được chia thành ~ 700 bảng.
Thiết lập này không có vấn đề gì với việc chèn, nó không mất nhiều thời gian hơn vì thời gian đã được tạo ra cho mỗi bảng.
Vấn đề chân không
Như i_like_caffeine đã chỉ ra, lệnh VACUUM là một vấn đề khi tệp sqlite càng lớn. Khi nhiều thao tác chèn / xóa được thực hiện, sự phân mảnh của tệp trên đĩa sẽ trở nên tồi tệ hơn, vì vậy mục tiêu là định kỳ VACUUM để tối ưu hóa tệp và khôi phục không gian tệp.
Tuy nhiên, như được chỉ ra bởi tài liệu , một bản sao đầy đủ của cơ sở dữ liệu được tạo ra để làm chân không, mất một thời gian rất dài để hoàn thành. Vì vậy, cơ sở dữ liệu càng nhỏ, thao tác này sẽ kết thúc càng nhanh.
Kết luận
Đối với ứng dụng cụ thể của tôi, có lẽ tôi sẽ phân tách dữ liệu qua một số tệp db, mỗi tệp một ngày, để đạt hiệu suất tốt nhất cả về hiệu suất chân không và tốc độ chèn / xóa.
Điều này làm phức tạp các truy vấn, nhưng đối với tôi, đó là một sự đánh đổi đáng giá để có thể lập chỉ mục nhiều dữ liệu này. Một lợi thế nữa là tôi có thể xóa toàn bộ tệp db để giảm giá trị dữ liệu trong một ngày (một thao tác chung cho ứng dụng của tôi).
Có lẽ tôi cũng phải theo dõi kích thước bảng trên mỗi tệp để xem khi nào tốc độ sẽ trở thành vấn đề.
Thật tệ khi dường như không có một phương pháp chân không gia tăng nào ngoài việc hút bụi tự động . Tôi không thể sử dụng nó vì mục tiêu của tôi đối với chân không là chống phân mảnh tệp (không gian tệp không phải là vấn đề lớn), điều mà máy hút bụi tự động không làm được. Trong thực tế, tài liệu nói rằng nó có thể làm cho sự phân mảnh trở nên tồi tệ hơn, vì vậy tôi phải dùng đến việc định kỳ thực hiện toàn bộ chân không trên tệp.