SQLite и AppllyUpdate

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

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

SQLite и AppllyUpdate

Сообщение fpbt » 13.05.2012 19:27:09

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

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

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

Re: SQLite и AppllyUpdate

Сообщение v-t-l » 13.05.2012 21:37:36

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

Зачем ApplyUpdates после каждого Post? - открывается транзакция, создается файл журнала, изменения применяются, транзакция закрывается, файл журнала удаляется - и так для каждой записи.
v-t-l
энтузиаст
 
Сообщения: 742
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Re: SQLite и AppllyUpdate

Сообщение fpbt » 13.05.2012 22:53:36

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

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

Я понимаю. Как тогда реализовать по другому, но чтобы осталась таблица генерации уникальных "id"-шников?
fpbt
новенький
 
Сообщения: 17
Зарегистрирован: 27.09.2011 21:48:35

Re: SQLite и AppllyUpdate

Сообщение v-t-l » 14.05.2012 16:15:54

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

Вообще, есть у меня предположение, что все можно сделать одним SQL-скриптом :D .
v-t-l
энтузиаст
 
Сообщения: 742
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Re: SQLite и AppllyUpdate

Сообщение fpbt » 15.05.2012 22:16:11

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 осталась. Пока скорости хватает.
fpbt
новенький
 
Сообщения: 17
Зарегистрирован: 27.09.2011 21:48:35


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 237

Рейтинг@Mail.ru