sqlite обновляется медленно (15 секунд для 1720 записей) на SSD-диске

Уважаемый коллега-разработчик, по какой-то причине обновление для 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 записей происходит практически мгновенно. Можете ли вы помочь мне и дать мне несколько советов, как это исправить?


person Ger Teunis    schedule 20.05.2011    source источник


Ответы (1)


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

Теперь я изменил код: а) подготовьте команду и повторно используйте эту команду для всех подлежащих обновлению записей. б) COMMIT и НАЧАТЬ новую транзакцию каждые 1500 записей

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

person Ger Teunis    schedule 06.06.2011