crossplatform.ru

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

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Многопоточность при работе с БД
kibsoft
  опции профиля:
сообщение 14.2.2010, 12:17
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 180
Регистрация: 21.7.2009
Из: Самара
Пользователь №: 928

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




Репутация:   2  


Есть примерно 58000 записей, я их через execBatch() забиваю в базу (СУБД ORACLE), на это уходит около 4 секунд..вопрос: если например запись в базу разбить на два потока, то можно ускорить запись? Хотя бы теоретически это возможно?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 14.2.2010, 12:32
Сообщение #2


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

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




Репутация:   40  


Это как я понимаю уже нужно обращаться к специфике работы самих БД.
Может не оптимальна настройка самой БД может еще чего...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 14.2.2010, 14:14
Сообщение #3


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

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

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




Репутация:   94  


kibsoft, при вставке больших пачек данных, обычно блокируют (отключают) индексы, а после вставки включают вновь. Т.к. индексация осуществляется во время добавления (вставки) данных
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 14.2.2010, 15:15
Сообщение #4


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

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




Репутация:   34  


Можно попробовать вызывать BEGIN TRANSACTION перед вставкой, и COMMIT TRANSACTION после. И заливать данные не в таблицу, которую ты собираешься добавлять данные, а сначала во временную, а уже из неё копировать в оригинальную: INSERT INTO TABLE2 SELECT * FROM TABLE1
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kibsoft
  опции профиля:
сообщение 15.2.2010, 17:53
Сообщение #5


Участник
**

Группа: Участник
Сообщений: 180
Регистрация: 21.7.2009
Из: Самара
Пользователь №: 928

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




Репутация:   2  


Цитата(Litkevich Yuriy @ 14.2.2010, 15:14) *
kibsoft, при вставке больших пачек данных, обычно блокируют (отключают) индексы, а после вставки включают вновь. Т.к. индексация осуществляется во время добавления (вставки) данных


Отключаю, после выполнения запроса вставки включаю, но выдает ошибку:
"ORA-01502: index 'CHASTDICT.WORDIND' or partition of such index is in unusable state

Вот код:
qDebug()<<query.exec("ALTER INDEX WORDIND UNUSABLE");
        query.prepare("INSERT INTO WORDS(WORD,COUNT) VALUES(?,?)");
        keys=QVariant(insertBase.keys()).toList();
        values=insertBase.values();
        query.addBindValue(keys);
        query.addBindValue(values);
        qDebug()<<query.execBatch();
        qDebug()<<query.lastError().databaseText();
        qDebug()<<query.exec("ALTER INDEX WORDIND REBUILD");
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MoPDoBoPoT
  опции профиля:
сообщение 15.2.2010, 18:41
Сообщение #6


Участник
**

Группа: Участник
Сообщений: 172
Регистрация: 7.5.2009
Из: Москва
Пользователь №: 738

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




Репутация:   9  


Цитата(kibsoft @ 15.2.2010, 17:53) *
...
query.prepare("INSERT INTO WORDS(WORD,COUNT) VALUES(?,?)");
query.addBindValue(keys);
query.addBindValue(values);
...

Так Оракл же даржит именное связывание, а не позиционное. Попробуй так:
        query.prepare("INSERT INTO WORDS(WORD, COUNT) VALUES(:word, :count)");
        keys=QVariant(insertBase.keys()).toList();
        values=insertBase.values();
        query.bindValue(":word", keys);
        query.bindValue(":count", values);
        qDebug()<<query.execBatch();
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kibsoft
  опции профиля:
сообщение 15.2.2010, 19:17
Сообщение #7


Участник
**

Группа: Участник
Сообщений: 180
Регистрация: 21.7.2009
Из: Самара
Пользователь №: 928

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




Репутация:   2  


Цитата(MoPDoBoPoT @ 15.2.2010, 19:41) *
Цитата(kibsoft @ 15.2.2010, 17:53) *
...
query.prepare("INSERT INTO WORDS(WORD,COUNT) VALUES(?,?)");
query.addBindValue(keys);
query.addBindValue(values);
...

Так Оракл же даржит именное связывание, а не позиционное. Попробуй так:
        query.prepare("INSERT INTO WORDS(WORD, COUNT) VALUES(:word, :count)");
        keys=QVariant(insertBase.keys()).toList();
        values=insertBase.values();
        query.bindValue(":word", keys);
        query.bindValue(":count", values);
        qDebug()<<query.execBatch();



Не в этом дело..без отлючения/влючения индекса и с позиционным работает...но дольше вставка идет чем без индекса, но зато обновление базы с индексом намного быстрее.. вот я и хочу на время вствки его отключать, но видимо так нельзя..
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 15.2.2010, 19:38
Сообщение #8


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

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

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




Репутация:   94  


kibsoft, ты транзакции используешь?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MoPDoBoPoT
  опции профиля:
сообщение 15.2.2010, 20:07
Сообщение #9


Участник
**

Группа: Участник
Сообщений: 172
Регистрация: 7.5.2009
Из: Москва
Пользователь №: 738

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




Репутация:   9  


Цитата(kibsoft @ 15.2.2010, 19:17) *
Не в этом дело..без отлючения/влючения индекса и с позиционным работает...но дольше вставка идет чем без индекса, но зато обновление базы с индексом намного быстрее.. вот я и хочу на время вствки его отключать, но видимо так нельзя..

Я в курсе. Конечной целью у тебя является увеличить скорость записи данных в БД, потому я и сделал замечание. Собственно, подготовка запроса (prepare) служит для того, чтобы СУБД разобрало текст запроса один раз и поместила его в библиотечный кэш, а пользовалось им много раз (сам разбор запроса занимает некоторое время).
Насчет индексов - спроси про это на sql.ru, там прохаванные в этом люди.
Цитата(Litkevich Yuriy @ 15.2.2010, 19:38) *
kibsoft, ты транзакции используешь?

Так он же execBatch() пользуется, там уже оптимизировано в этом плане.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 15.2.2010, 20:24
Сообщение #10


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

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

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




Репутация:   94  


Цитата(MoPDoBoPoT @ 15.2.2010, 23:07) *
там уже оптимизировано в этом плане.
вот не могу вспомнить/найти, где это обсуждалось. Явное использование транзакции помогало ускорить процесс.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 28.3.2024, 13:35