Delphi→ Ускоритель SQLite запросов
Ноя 4, 2010
Использовав в своем проекте модуль SQLite, я ужаснулся его тормознутостью. Оказывается есть способ ускорить выполнение запросов используя транзакции. И если у вас скуллайт работает медленно, то вы просто не умеете его готовить. О рецепте далее…
При разработке программы заметил, что скорость выполнения запросов INSERT и UPDATE очень маленькая. На формирование базы из 50k запросов уходит по 3-4 минуты. Как выяснилось, причиной тому является запись данных в файл базы, которая происходит после каждого запроса. Естественно, такая ситуация будет приводить к торможению работы базы — скорость отклика жесткого диска достаточно маленькая.
В этом можно убедиться замерив разницу между копированием одного файла размером 20 Мб и десятью тысячью файлов с таким же общим объемом.
Избавиться от этой неприятности нам поможет использование транзакций. Когда запросы будут обернуты в неё, их выполнение и запись в файл начнется только после завершения транзакции.
procedure SQLiteInsert; var dbSQL: TSQLiteDatabase; begin dbSQL := TSQLiteDatabase.Create('database.sqlite'); if dbSQL.TableExists('devices') then begin dbSQL.BeginTransaction; {начало транзакции} for i := 0 to 50000 do begin dbSQL.AddParamText(':variable', 'TEST'); dbSQL.ExecSQL('INSERT INTO devices VALUES(:variable)'); {запрос} end; dbSQL.Commit; {конец транзакции} end; FreeAndNil(dbSQL); end;
Команда BeginTransaction начинает транзакцию т.е. сохраняет все последующие запросы во временную память и выполняет их только после того, как встретит команду Commit, что означает конец транзакции.
После этих манипуляций все те же 50k запросов стали инсертится менее чем за минуту.
P.S. Для подключения модуля SQLite, достаточно добавить в uses SQLiteTable.