Здравствуйте.
У меня возник вопрос касательно SQLite и Lazarus (у меня v 1.1).
Почему-то AupplyUpdates делается о-о-о-чень долго. Может ли быть это связано с проблемой в компоненте "sqlite3laz 0.4" ?
Как пример, создал я базу SQLite (v 3.7.11) c 3-мя таблицами: table_01, table_01_gen, table_02.
Таблица table_01_gen служит для генерации ключа к таблицам table_01 и ещё используется в table_02.
Получается что для начала, мне надо добавить запись в таблицу table_01_gen и потом получить от неё сгенерированный id (свойства: INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL).
Я делаю так:
1. SQLite3.Apend;
2. SQLite3.FieldByName('DateAndTime').AsDateTime := Now();
3. SQLite3.Post;
4. iTmp_1 := SQLite3.RecNo;
5. SQLite3.ApplyUpdate;
6. SQLite3.RefetchData;
7. SQLite3.RecNo := iTmp_1;
8. Использую id данной строки далее где надо.
Вся загвоздка в "SQLite3.ApplyUpdate;" он делается слишком долго, примерно 100-200 записей за секунду на пустой базе.
В чем дело и как это исправить?
Спасибо.
SQLite и AppllyUpdate
Модератор: Модераторы
fpbt писал(а):Вся загвоздка в "SQLite3.ApplyUpdate;" он делается слишком долго, примерно 100-200 записей за секунду на пустой базе.
Зачем ApplyUpdates после каждого Post? - открывается транзакция, создается файл журнала, изменения применяются, транзакция закрывается, файл журнала удаляется - и так для каждой записи.
v-t-l писал(а):fpbt писал(а):Вся загвоздка в "SQLite3.ApplyUpdate;" он делается слишком долго, примерно 100-200 записей за секунду на пустой базе.
Зачем ApplyUpdates после каждого Post? - открывается транзакция, создается файл журнала, изменения применяются, транзакция закрывается, файл журнала удаляется - и так для каждой записи.
Я понимаю. Как тогда реализовать по другому, но чтобы осталась таблица генерации уникальных "id"-шников?
Идея в том, что надо один раз начать транзакцию (BEGIN TRANSACTION;), вписать все изменения, закрыть транзакцию (COMMIT;).
Идентификатор последней вставленной записи можно получать запросом "SELECT last_insert_rowid();".
Вообще, есть у меня предположение, что все можно сделать одним SQL-скриптом
.
Идентификатор последней вставленной записи можно получать запросом "SELECT last_insert_rowid();".
Вообще, есть у меня предположение, что все можно сделать одним SQL-скриптом
v-t-l писал(а):Зачем ApplyUpdates после каждого Post? - открывается транзакция, создается файл журнала, изменения применяются, транзакция закрывается, файл журнала удаляется - и так для каждой записи.
Я так получаю уникальный id уже прописанный в базе и использую его в нескольких других таблицах. Если не делать ApplyUpdates то id не определён.
v-t-l писал(а):Идея в том, что надо один раз начать транзакцию (BEGIN TRANSACTION;), вписать все изменения, закрыть транзакцию (COMMIT;).
Идентификатор последней вставленной записи можно получать запросом "SELECT last_insert_rowid();".
Вообще, есть у меня предположение, что все можно сделать одним SQL-скриптом.
Спасибо за "SELECT last_insert_rowid();", не знал.
Проблема решена путем пересмотра структуры БД исходя из специфики задачи. Таблица генерирующая id осталась. Пока скорости хватает.
