Tôi đã từng đùa giỡn với việc chuyển từ các tệp truy cập ms sang tệp SQLite cho các nhu cầu cơ sở dữ liệu đơn giản của tôi; vì các lý do thông thường: kích thước tệp nhỏ hơn, chi phí thấp hơn, nguồn mở, v.v.Cách tăng tốc truy vấn với nhiều INNER JOIN
Một điều ngăn cản tôi thực hiện chuyển đổi là điều thiếu tốc độ trong SQLite. Đối với các truy vấn SELECT đơn giản, SQLite có vẻ hoạt động tốt, hoặc tốt hơn so với MS-Access. Vấn đề xảy ra với truy vấn SELECT khá phức tạp với nhiều câu lệnh INNER JOIN:
SELECT DISTINCT
DESCRIPTIONS.[oCode] AS OptionCode,
DESCRIPTIONS.[descShort] AS OptionDescription
FROM DESCRIPTIONS
INNER JOIN tbl_D_E ON DESCRIPTIONS.[oCode] = tbl_D_E.[D]
INNER JOIN tbl_D_F ON DESCRIPTIONS.[oCode] = tbl_D_F.[D]
INNER JOIN tbl_D_H ON DESCRIPTIONS.[oCode] = tbl_D_H.[D]
INNER JOIN tbl_D_J ON DESCRIPTIONS.[oCode] = tbl_D_J.[D]
INNER JOIN tbl_D_T ON DESCRIPTIONS.[oCode] = tbl_D_T.[D]
INNER JOIN tbl_Y_D ON DESCRIPTIONS.[oCode] = tbl_Y_D.[D]
WHERE ((tbl_D_E.[E] LIKE '%')
AND (tbl_D_H.[oType] ='STANDARD')
AND (tbl_D_J.[oType] ='STANDARD')
AND (tbl_Y_D.[Y] = '41')
AND (tbl_Y_D.[oType] ='STANDARD')
AND (DESCRIPTIONS.[oMod]='D'))
Trong truy cập MS, truy vấn này thực hiện trong khoảng 2,5 giây. Trong SQLite, phải mất hơn 8 phút. Phải mất cùng một lượng thời gian cho dù tôi đang chạy truy vấn từ mã VB hoặc từ dấu nhắc lệnh bằng cách sử dụng sqlite3.exe.
Vì vậy, câu hỏi của tôi như sau:
- là SQLite chỉ không được tối ưu hóa để xử lý nhiều lệnh INNER JOIN?
- Tôi đã làm điều gì đó rõ ràng là ngu ngốc trong truy vấn của mình (vì tôi mới sử dụng SQLite) khiến nó quá chậm?
Và trước khi bất kỳ ai đề xuất một công nghệ hoàn toàn khác, tôi không thể chuyển đổi. Lựa chọn của tôi là MS-Access hoặc SQLite. :)
CẬP NHẬT: Chỉ định một INDEX cho mỗi cột trong cơ sở dữ liệu SQLite giảm thời gian truy vấn từ trên 8 phút xuống còn khoảng 6 giây. Nhờ có Larry Lustig để giải thích lý do tại sao INDEXing là cần thiết.
Bạn đang sử dụng INDEXES? –
@Phill Pafford: Tôi không sử dụng các chỉ mục trên dữ liệu MS-Access hoặc SQLite. Tôi đang cố gắng để so sánh truy cập vào sqlite vì vậy tôi đã để lại cấu trúc dữ liệu giống nhau trong cả hai. – Stewbob
Không thể đăng câu trả lời, vì vậy hãy thử nhận xét: MS Access rất tích cực về việc lập chỉ mục các cột thay mặt bạn, trong khi SQLite sẽ yêu cầu bạn tạo một cách rõ ràng các chỉ mục bạn cần. Vì vậy, có thể Access đã lập chỉ mục [Mô tả] hoặc [D] cho bạn nhưng các chỉ mục đó bị thiếu trong SQLite. Tôi không có kinh nghiệm với số lượng hoạt động JOIN đó trong SQLite. Tôi đã sử dụng nó trong một dự án Django với một lượng dữ liệu tương đối nhỏ và không phát hiện bất kỳ vấn đề hiệu suất nào. –