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.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *