SQLite и AppllyUpdate

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
fpbt
новенький
Сообщения: 17
Зарегистрирован: 27.09.2011 21:48:35

SQLite и AppllyUpdate

Сообщение fpbt »

Здравствуйте.
У меня возник вопрос касательно 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 записей за секунду на пустой базе.

В чем дело и как это исправить?

Спасибо.
v-t-l
энтузиаст
Сообщения: 744
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Сообщение v-t-l »

fpbt писал(а):Вся загвоздка в "SQLite3.ApplyUpdate;" он делается слишком долго, примерно 100-200 записей за секунду на пустой базе.

Зачем ApplyUpdates после каждого Post? - открывается транзакция, создается файл журнала, изменения применяются, транзакция закрывается, файл журнала удаляется - и так для каждой записи.
fpbt
новенький
Сообщения: 17
Зарегистрирован: 27.09.2011 21:48:35

Сообщение fpbt »

v-t-l писал(а):
fpbt писал(а):Вся загвоздка в "SQLite3.ApplyUpdate;" он делается слишком долго, примерно 100-200 записей за секунду на пустой базе.

Зачем ApplyUpdates после каждого Post? - открывается транзакция, создается файл журнала, изменения применяются, транзакция закрывается, файл журнала удаляется - и так для каждой записи.

Я понимаю. Как тогда реализовать по другому, но чтобы осталась таблица генерации уникальных "id"-шников?
v-t-l
энтузиаст
Сообщения: 744
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Сообщение v-t-l »

Идея в том, что надо один раз начать транзакцию (BEGIN TRANSACTION;), вписать все изменения, закрыть транзакцию (COMMIT;).
Идентификатор последней вставленной записи можно получать запросом "SELECT last_insert_rowid();".

Вообще, есть у меня предположение, что все можно сделать одним SQL-скриптом :D .
fpbt
новенький
Сообщения: 17
Зарегистрирован: 27.09.2011 21:48:35

Сообщение fpbt »

v-t-l писал(а):Зачем ApplyUpdates после каждого Post? - открывается транзакция, создается файл журнала, изменения применяются, транзакция закрывается, файл журнала удаляется - и так для каждой записи.

Я так получаю уникальный id уже прописанный в базе и использую его в нескольких других таблицах. Если не делать ApplyUpdates то id не определён.

v-t-l писал(а):Идея в том, что надо один раз начать транзакцию (BEGIN TRANSACTION;), вписать все изменения, закрыть транзакцию (COMMIT;).
Идентификатор последней вставленной записи можно получать запросом "SELECT last_insert_rowid();".

Вообще, есть у меня предположение, что все можно сделать одним SQL-скриптом :D .


Спасибо за "SELECT last_insert_rowid();", не знал.

Проблема решена путем пересмотра структуры БД исходя из специфики задачи. Таблица генерирующая id осталась. Пока скорости хватает.
Ответить