crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

4 страниц V   1 2 3 > »   
Ответить в данную темуНачать новую тему
> Как ускорить создание таблицы (через QSqlQuery)?
Rocky
  опции профиля:
сообщение 16.2.2009, 13:32
Сообщение #1


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

Спасибо сказали: 22 раз(а)




Репутация:   7  


Создаю таблицу и заполняю ее посредством запроса INSERT. В таблицы больше 1к записей и заполнение идет очень долго... Можно ли как-нибудь ускорить запись? Оптимизировать это дело?

Да, кто знает, обязательно ли перед каждым вызовом QSqlQuery::exec использовать QSqlQuery::prepare (все это происходит в цикле)? Или QSqlQuery::prepare достаточно вызывать один раз перед циклом, а внутри делать только QSqlQuery::bindValue и затем QSqlQuery::exec?

Спасибо!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 16.2.2009, 13:45
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Rocky @ 16.2.2009, 16:32) *
обязательно ли перед каждым вызовом QSqlQuery::exec использовать QSqlQuery::prepare (все это происходит в цикле)?
да он для того и предназначен, чтобы его вынести можно было из цикла:
query.prepare("SELECT F_GROUP FROM APPUSER WHERE (F_ID = :id)");
for(...)
{
    query.bindValue(":id", id);
    if (! query.exec())
    {
        // Обработать ошибку
    }
}


Цитата(Rocky @ 16.2.2009, 16:32) *
Создаю таблицу и заполняю ее посредством запроса INSERT. В таблицы больше 1к записей и заполнение идет очень долго...
Что за СУБД и сколько по времени это занимает?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Rocky
  опции профиля:
сообщение 16.2.2009, 15:15
Сообщение #3


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

Спасибо сказали: 22 раз(а)




Репутация:   7  


СУБД SQLite 3.
В базе 11 таблиц, общее число вставляемых записей около 5.3к. 5.3к записей вставляется 18 мин (prepare я уже вынес из тел циклов). Задержек в других местах в коде нет точно (есть только цикл, внутри которого bindValue и exec).

Когда работал через ODBC с MS Access, было все намнооого быстрее (4к записей около минуты)...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 16.2.2009, 16:05
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Rocky @ 16.2.2009, 18:15) *
Когда работал через ODBC с MS Access, было все намнооого быстрее
ну ты сравнил, Лайт придуман для учебых целей, да нвские мелкие настройки хранить. 4К записей для него слишком жирно.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Rocky
  опции профиля:
сообщение 16.2.2009, 16:31
Сообщение #5


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

Спасибо сказали: 22 раз(а)




Репутация:   7  


А есть какой-нибудь "легкий" вариант, т.е. чтобы база была под рукой (рядом с прогой), но кроме драйвера ничего не требовалось устанавливать? (никаких серверов БД и пр).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
trdm
  опции профиля:
сообщение 16.2.2009, 16:57
Сообщение #6


Дмитрий Трошин
****

Группа: Участник
Сообщений: 575
Регистрация: 12.1.2008
Пользователь №: 68

Спасибо сказали: 21 раз(а)




Репутация:   6  


Цитата(Rocky @ 16.2.2009, 13:32) *
Создаю таблицу и заполняю ее посредством запроса INSERT. В таблицы больше 1к записей и заполнение идет очень долго... Можно ли как-нибудь ускорить запись? Оптимизировать это дело?

_db.transaction();
+
_db.commit();

bool transaction ()
и т.п.

Сообщение отредактировал trdm - 16.2.2009, 17:00
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 16.2.2009, 17:27
Сообщение #7


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


trdm, транзакция не ускоряет процесс, она лишь делает его атомарным

Цитата(Rocky @ 16.2.2009, 19:31) *
А есть какой-нибудь "легкий" вариант, т.е. чтобы база была под рукой (рядом с прогой), но кроме драйвера ничего не требовалось устанавливать? (никаких серверов БД и пр).
можно FireBird или MySQL использовать, у них есть встраиваемые версии, dll'ку подкладываешь в каталог приложения и все.
Обе эти СУБД хранять БД в виде одного файла (бывают конечно и многофайловые БД, но это уже другая история)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
trdm
  опции профиля:
сообщение 16.2.2009, 18:00
Сообщение #8


Дмитрий Трошин
****

Группа: Участник
Сообщений: 575
Регистрация: 12.1.2008
Пользователь №: 68

Спасибо сказали: 21 раз(а)




Репутация:   6  


Цитата(Litkevich Yuriy @ 16.2.2009, 17:27) *
trdm, транзакция не ускоряет процесс, она лишь делает его атомарным

еще как ускоряет.. была такая же проблема, выручила транзакция.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
panter_dsd
  опции профиля:
сообщение 16.2.2009, 19:38
Сообщение #9


Жаждущий знаний
***

Группа: Участник
Сообщений: 254
Регистрация: 1.1.2009
Из: Санкт-Петербург
Пользователь №: 474

Спасибо сказали: 32 раз(а)




Репутация:   3  


Полностью согласен с trdm, сам сталкивался. Соотношения времени огромные. У меня до использования транзакции работа занимала минуты три, после использования онной стало несколько секунд. О как. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Константин
  опции профиля:
сообщение 16.2.2009, 21:44
Сообщение #10


Студент
*

Группа: Участник
Сообщений: 69
Регистрация: 9.2.2009
Пользователь №: 539

Спасибо сказали: 15 раз(а)




Репутация:   1  


Цитата(Litkevich Yuriy @ 16.2.2009, 17:27) *
можно FireBird или MySQL использовать, у них есть встраиваемые версии, dll'ку подкладываешь в каталог приложения и все.
Обе эти СУБД хранять БД в виде одного файла (бывают конечно и многофайловые БД, но это уже другая история)

встроенный мускуль хранит базы так же, как и полноценный :) и с ним чуть больше гемора...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

4 страниц V   1 2 3 > » 
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 15.11.2019, 3:03