Trước khi bạn đánh dấu câu hỏi này là trùng lặp, XIN VUI LÒNG NGHE TÔI RA !!
Tôi đã đọc các câu hỏi được hỏi ở đây về cách cải thiện hiệu suất, ví dụ: chỉ cần đề cập đến một vài số Improve INSERT-per-second performance of SQLite? và What are the performance characteristics of sqlite with very large database files?SQLite: giới hạn thực tế là gì?
Tôi đang cố gắng làm cho sqlite hoạt động với kích thước tệp cơ sở dữ liệu là 5 gigabyte. Ngược lại, có những người ở đó, những người tuyên bố rằng sqlite hoạt động 'tuyệt vời' cho họ ngay cả khi kích thước cơ sở dữ liệu lớn tới 160 GB. Tôi đã không thử nó bản thân mình nhưng từ những câu hỏi hỏi, tôi đoán rằng tất cả các băng ghế dự bị-đánh dấu có lẽ được thực hiện chỉ với bảng trong cơ sở dữ liệu.
Tôi đang sử dụng một cơ sở dữ liệu với
- 20 hoặc lâu hơn bảng
- Một nửa trong số các bảng có hơn 15 cột
- Mỗi 15-or-cái cột bảng có 6/7 chính nước ngoài cột - Một vài trong số các bảng này đã phát triển để có 27 triệu bản ghi trong một tháng
Máy phát triển mà tôi đang sử dụng là 3 GHz Máy lõi tứ có 4 gờ RAM và phải mất hơn 3 phút chỉ để truy vấn row_count trong các bảng lớn này.
Tôi không thể tìm thấy bất kỳ cách nào để phân chia dữ liệu theo chiều ngang. Ảnh chụp tốt nhất mà tôi có là chia nhỏ dữ liệu trên nhiều tệp cơ sở dữ liệu cho mỗi bảng. Nhưng trong trường hợp đó, theo như tôi biết, các ràng buộc cột khóa ngoài không thể được sử dụng, vì vậy tôi sẽ phải tạo một bảng tự đủ (không có bất kỳ khóa ngoại).
Vì vậy, câu hỏi của tôi là
a) Tôi có sử dụng cơ sở dữ liệu sai cho công việc không?
b) Bạn nghĩ tôi đang đi sai ở đâu?
c) Tôi chưa thêm các chỉ mục trên các khóa ngoại trừ nếu chỉ truy vấn đếm hàng mất bốn phút thì các chỉ mục của các khóa ngoài sẽ giúp tôi như thế nào?
EDIT Để cung cấp thêm thông tin mặc dù không có ai đã yêu cầu cho nó :) Tôi đang sử dụng SQLite phiên bản 3.7.9 với phiên bản system.data.sqlite.dll 1.0.77.0
EDIT2: TÔI NGHĨ nơi tôi sẽ khác với những người biểu diễn 160 gigabyte là họ có thể chọn một bản ghi cá nhân hoặc một phạm vi nhỏ các bản ghi. Nhưng tôi phải tải tất cả 27 triệu hàng trong bảng của tôi, nối chúng với một bảng khác, nhóm các bản ghi theo yêu cầu của Người dùng và trả về kết quả. Bất kỳ đầu vào nào là cách tốt nhất để tối ưu hóa cơ sở dữ liệu cho kết quả như vậy.
Tôi không thể lưu trữ kết quả của truy vấn trước đó vì nó không có ý nghĩa trong trường hợp của tôi. Cơ hội nhấn cache sẽ khá thấp.
Nếu người khác nói rằng cơ sở dữ liệu 160GB chạy tốt, rõ ràng nó phải là thứ bạn đang làm, nhưng bạn không nói với chúng tôi cách bạn làm mọi thứ, ngoại trừ việc bạn không có chỉ mục ở nước ngoài phím. Bạn đã thử * lập chỉ mục các khóa ngoại? –
Theo các câu hỏi được hỏi, tôi đoán rằng 160 cơ sở dữ liệu Gb chỉ sử dụng một bảng. Không, tôi chưa thêm các chỉ mục trên các khóa ngoại, bởi vì ngay cả khi tôi chạy truy vấn mà các khóa ngoại không liên quan tức là 'Chọn số (*) từ some_table', sqlite mất vài phút để trả về kết quả của truy vấn này. Tôi sẽ thêm chỉ mục vào khóa ngoài và quay lại. Vui lòng cho tôi biết bạn muốn biết thêm thông tin nào. – WPFAbsoluteNewBie
Bạn có chỉ mục trên bảng không? –