crossplatform.ru

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

> Быстрая вставка миллиона строк в MySQL, prepare,exec
VladimirPivovar
  опции профиля:
сообщение 18.9.2011, 11:46
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 2
Регистрация: 18.9.2011
Пользователь №: 2883

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




Репутация:   0  


Решил написать алгоритм, который бы быстро вставлял в базу несколько сотен миллионов строк в MySQL

Пока остановился на том, чтобы проверить как вставляется несколько одинаковых строк в цикле:

  qDebug()<<QTime::currentTime();

if (query.prepare("INSERT INTO mainpackage (phoneNumberA,phoneNumberB,phoneNumberC,phoneNumberD,phoneNumberE)"
   "VALUES (?,?,?,?,?)"))
    {
        for (int i=0; i<1000000; i++)
        {
        query.addBindValue(QString("1234567891011"));
        query.addBindValue(QString("1234567891012"));
        query.addBindValue(QString("1234567891013"));
        query.addBindValue(QString("1234567891014"));
        query.addBindValue(QString("1234567891015"));

        }

      qDebug() << query.exec() << "blablabla";
      qDebug() << query.lastError().databaseText();
      qDebug()<<QTime::currentTime();
}





Вместо (?,?,?,?,?) должны ведь подставляться строки 1234567891011 и т. д.

однако при выполнении вываливается ошибка : "No data supplied for parameters in prepared statement"

как побороть данную проблему?

Сообщение отредактировал ViGOur - 6.10.2011, 14:40
Причина редактирования: не забываем про тэг code
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
ilyabvt
  опции профиля:
сообщение 18.9.2011, 17:14
Сообщение #2


Активный участник
***

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

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




Репутация:   3  


query.exec() надо вызывать внутри цикла, а не после.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
vadim303
  опции профиля:
сообщение 6.10.2011, 11:51
Сообщение #3


Студент
*

Группа: Новичок
Сообщений: 14
Регистрация: 18.1.2010
Пользователь №: 1382

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




Репутация:   0  


Цитата(ilyabvt @ 18.9.2011, 18:14) *
query.exec() надо вызывать внутри цикла, а не после.

в этом случае будут выполнены миллионы запросов, что не есть гуд. Я бы присмотрелся к методу QSqlQuery::execBatch(). В хелпе и пример доходчивый к нему есть. Возможно за один его вызов все сотни миллионов строк запихивать не хорошо получится, но партиями точно будет быстрее чем одиночными exec(). Ну а размер партий экспериментально определить...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


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




RSS Текстовая версия Сейчас: 27.12.2024, 2:00