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

#performance #sqlite #solid-state-drive

#Производительность #sqlite #твердотельный накопитель

Вопрос:

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

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

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

 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:

Я нашел ответ, выполнив несколько старых добрых тестов и попробовав. Похоже, что sqlite зависает на SSD с TRIM при выполнении множества отдельных инструкций ОБНОВЛЕНИЯ друг за другом в транзакции.

Теперь я изменил код: a) подготовьте команду и повторно используйте эту команду для всех обновляемых записей. б) ФИКСИРУЙТЕ и НАЧИНАЙТЕ новую транзакцию каждые 1500 записей

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