tôi sẽ đề nghị bạn đọc câu hỏi Stack Overflow:
How do I improve the performance of SQLite?
Đó là một cái nhìn rất thourough tại làm thế nào để cải thiện hiệu suất của SQLite nói chung, và nó đã rất hữu ích khi tôi chạm vấn đề tốc độ cố gắng chèn 100.000 bản ghi vào cơ sở dữ liệu SQLite trên iOS.
Cụ thể, việc sử dụng Giao dịch giảm đáng kể tốc độ chèn tổng thể. Đây là một khối mã ngắn mẫu để bạn có thể thấy những gì tôi có nghĩa là:
const char *dbpath = [[Utilities pathInDocumentsFolder: MY_DATABASE] UTF8String];
const char *sql = "INSERT INTO Filters (Region, District, Territory) " \
"VALUES (?, ?, ?)";
sqlite3 *mapDB;
char *sqliteError;
sqlite3_stmt *insertStatement;
sqlite3_open(dbpath, &mapDB);
sqlite3_exec(mapDB, "BEGIN TRANSACTION", NULL, NULL, &sqliteError);
if (sqlite3_prepare_v2(mapDB, sql, -1, &insertStatement, NULL) == SQLITE_OK) {
for (NSArray *row in filtersArray) {
sqlite3_bind_text(insertStatement, 1, [[row objectAtIndex: 0] UTF8String], -1, SQLITE_TRANSIENT); // Region
sqlite3_bind_text(insertStatement, 2, [[row objectAtIndex: 1] UTF8String], -1, SQLITE_TRANSIENT); // District
sqlite3_bind_text(insertStatement, 3, [[row objectAtIndex: 2] UTF8String], -1, SQLITE_TRANSIENT); // Territory
if (sqlite3_step(insertStatement) != SQLITE_DONE) {
break;
}
sqlite3_clear_bindings(insertStatement);
sqlite3_reset(insertStatement);
}
}
sqlite3_exec(mapDB, "END TRANSACTION", NULL, NULL, &sqliteError);
sqlite3_finalize(insertStatement);
Các sqlite3_exec
với những điều khoản BEGIN
và END TRANSACTION
là sự kỳ diệu.
sử dụng tính năng SQLTransaction để chèn dữ liệu vào bảng – Kalpesh
Chỉ 1GB cho đồng bộ hóa ban đầu hoặc lặp lại? –
Nếu một loạt các hồ sơ, giao dịch có thể giúp đỡ. Nếu bạn có các đốm màu lớn, SQLite không phù hợp với điều đó. Hãy cho chúng tôi biết thêm về dữ liệu, có lẽ chia sẻ một số mã nguồn. BTW, nó tấn công tôi rằng yếu tố hạn chế sẽ là lấy nó từ máy chủ, chứ không phải là tiết kiệm nó trên thiết bị của bạn. – Rob