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.

Скачать SQLite v3 (sqlite.dll + sqlite.pas)
Размер: 276.7 kB – Скачиваний: 167 – Скачан последний раз: 13.08.2012 23:48

Post to Twitter

Похожие статьи:

  1. Утечка памяти в IEnumVARIANT
  2. Количество элементов в IEnumVARIANT
  3. Компоненты в массиве TObjectList

Нет комментариев

Ваш комментарий

Rambler's Top100 Яндекс.Метрика