Медленное обновление sqlite (15 секунд для 1720 записей) на диске SSD - PullRequest
4 голосов
/ 20 мая 2011

Уважаемый коллега-разработчик, по какой-то причине обновление 1720 записей занимает около 15 секунд на диске SSD (особенно при включенной обрезке).

Я подправил настройки sqlite, используя следующий документ (который работает хорошо) http://web.utk.edu/~jplyon/sqlite/SQLite_optimization_FAQ.html

У меня есть следующий набор PRAGMA для оптимизации производительности, и я действительно использую транзакции вокруг полного набора обновлений.

sqlite3_exec(database, "PRAGMA cache_size=500000;", nil, nil, nil);
sqlite3_exec(database, "PRAGMA synchronous=OFF", nil, nil, nil);
sqlite3_exec(database, "PRAGMA count_changes=OFF", nil, nil, nil);
sqlite3_exec(database, "PRAGMA temp_store=MEMORY", nil, nil, nil);

Похоже, что SSD делает слишком много (например, удаление блоков и т. Д.), Что делает его блокированным на 15 секунд для простого обновления 1720 записей.

Довольно странно: вставка 2500 записей происходит практически мгновенно. Можете ли вы помочь мне и дать несколько советов, как это исправить?

1 Ответ

4 голосов
/ 06 июня 2011

Я нашел ответ, выполнив несколько старых тестов и попробовав. Похоже, что sqlite будет зависать на твердотельных накопителях с TRIM при выполнении большого количества отдельных операторов UPDATE друг за другом в транзакции.

Я изменил код сейчас: а) подготовить команду и повторно использовать ее для всех обновляемых записей. б) совершить и начать новую транзакцию каждые 1500 записей

похоже, это исправило зависание в sqlite. Итак, вкратце: повторно используйте подготовленный оператор SQL и убедитесь, что транзакция не становится слишком большой.

...