#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 и убедитесь, что транзакция не становится слишком большой.