Russian Qt Forum

Qt => Базы данных => Тема начата: kibsoft от Февраль 14, 2010, 12:16



Название: Совет по многопоточности при работе с базами..
Отправлено: kibsoft от Февраль 14, 2010, 12:16
Есть примерно 58000 записей, я их через execBatch() забиваю в базу (СУБД ORACLE), на это уходит около 4 секунд..вопрос: если например запись в базу разбить на два потока, то можно ускорить запись? Хотя бы теоретически это возможно?


Название: Re: Совет по многопоточности при работе с базами..
Отправлено: BlackTass от Февраль 14, 2010, 16:11
Должно помочь по идее. Делаете два треда, в каждом создаете коннекшен и половину записей батчите в одном, половину в другом


Название: Re: Совет по многопоточности при работе с базами..
Отправлено: sne от Февраль 14, 2010, 21:53
а еще очень могут помочь транзакции + query::prepare(), заместо query::exec(), если конечно это все уже не используется.


Название: Re: Совет по многопоточности при работе с базами..
Отправлено: BRE от Февраль 14, 2010, 22:01
А мне кажется, что использование нескольких потоков ощутимого ускорения не добавит. Все равно запросы к одной таблицы на сервере будут в очередь складываться и выполняться последовательно.


Название: Re: Совет по многопоточности при работе с базами..
Отправлено: BlackTass от Февраль 14, 2010, 23:25
А мне кажется, что использование нескольких потоков ощутимого ускорения не добавит. Все равно запросы к одной таблицы на сервере будут в очередь складываться и выполняться последовательно.
Это уже надо тестировать. Фиг его знает что в оракле наворочено. Может там основное то время на коннект с сервером тратится.


Название: Re: Совет по многопоточности при работе с базами..
Отправлено: BRE от Февраль 14, 2010, 23:58
Может там основное то время на коннект с сервером тратится.
Так а что тогда ускорят несколько потоков?


Название: Re: Совет по многопоточности при работе с базами..
Отправлено: break от Февраль 15, 2010, 01:01
Терзают смутные сомнения что пока реально не требуется оптимизации именно кода пишущего в БД - лучше с потоками не эксперементировать.

Возможны интересные ситуации - например если одна из записей откажется вставляться в таблицу из-за "вторичного ключа", а записи вставляемые во втором потоке зависели бы от этой невставленной записи также по вторичному ключу...

Это конечно более актуально при вставке записей в разные таблицы, но все равно возможно.


Название: Re: Совет по многопоточности при работе с базами..
Отправлено: voronElf от Февраль 15, 2010, 07:24
похожая ситуация была у меня, только не Oracl (к сожалению), а с sqlite я работал. Надо было больше 100 000 insert запросов сделать побыстрее, тратилось времени полчаса на это дело, разбил всю операцию на транзакции (по 500 запросов в каждой), процесс теперь успевает в 3 минуты. Я понимаю что способ очень некрасивый, но другого не нашел.


Название: Re: Совет по многопоточности при работе с базами..
Отправлено: sne от Февраль 15, 2010, 08:11
Я понимаю что способ очень некрасивый, но другого не нашел.
Для SQLite можно асинхронный режим "PRAGMA synchronous = ON;" работы с хранилищем попробовать включить, вероятно результаты без транзакций и с транзакциями, при этом, будут примерно равны.

ЗЫ
Описка, "PRAGMA synchronous = OFF;" конечно же :)


Название: Re: Совет по многопоточности при работе с базами..
Отправлено: Tonal от Февраль 15, 2010, 08:21
А смотреть что именно тормозит не пробовал? :)
Тормозить может (грубо):
1. Подготовка данных для заливки.
2. Передача данных на сервер.
3. Обработка сервером.
Разбивая заливку на 2 потока скорость какой именно части изменится?


Название: Re: Совет по многопоточности при работе с базами..
Отправлено: voronElf от Февраль 15, 2010, 09:13
Цитировать
Для SQLite можно асинхронный режим "PRAGMA synchronous = ON;"

Да можно, это даст тот же эффект (не будет блокировки таблицы на каждом запросе)

PS: есть у меня подозрение, что Ораклу транзакции не сильно помогут, но надо тестить


Название: Re: Совет по многопоточности при работе с базами..
Отправлено: ритт от Февраль 15, 2010, 09:43
http://www.linuxjournal.com/article/9602


Название: Re: Совет по многопоточности при работе с базами..
Отправлено: break от Февраль 15, 2010, 14:01
Цитировать
Для SQLite можно асинхронный режим "PRAGMA synchronous = ON;"

Кстати в FB тоже такой режим есть Forced Write - при его выключении работа БД сильно ускорялась, в свое время как раз использовал для таких больших импортов...


Название: Re: Совет по многопоточности при работе с базами..
Отправлено: Amigo_sa от Февраль 15, 2010, 14:53
похожая ситуация была у меня, только не Oracl (к сожалению), а с sqlite я работал. Надо было больше 100 000 insert запросов сделать побыстрее, тратилось времени полчаса на это дело, разбил всю операцию на транзакции (по 500 запросов в каждой), процесс теперь успевает в 3 минуты. Я понимаю что способ очень некрасивый, но другого не нашел.
Использовать транзакции - очень даже красивое решение :)
Разработчики сами предлагают такой путь (http://www.sqlite.org/speed.html).


Название: Re: Совет по многопоточности при работе с базами..
Отправлено: break от Февраль 15, 2010, 15:29
Цитировать
Использовать транзакции - очень даже красивое решение
Это кстати позволит отменить изменения целого блока - если одна из записей не всавилась, правде в некоторых серверах для этого еще удобнее savepoints.


Название: Re: Совет по многопоточности при работе с базами..
Отправлено: BlackTass от Февраль 15, 2010, 15:37
А смотреть что именно тормозит не пробовал? :)
Тормозить может (грубо):
1. Подготовка данных для заливки.
2. Передача данных на сервер.
3. Обработка сервером.
Разбивая заливку на 2 потока скорость какой именно части изменится?
Очевидно что первой и второй. Третья это черный ящик.


Название: Re: Совет по многопоточности при работе с базами..
Отправлено: MoPDoBoPoT от Февраль 15, 2010, 17:26
Использовать транзакции - очень даже красивое решение
Но не в данном случае, так как у автора оптимальное решение - "пакетная обработка" (execBatch()).

На кроссплатформ.ру Litkevich Yuriy дельно посоветовал отключить все индексы таблицы, а после включить. Но для более точно ответа надо идти на sql.ru в ветку Oracle (http://www.sql.ru/forum/actualtopics.aspx?bid=3), там более компитентные люди в данном вопросе, да и сам вопрос ближе к работе с Oracle, нежели чем к Qt.


Название: Re: Совет по многопоточности при работе с базами..
Отправлено: Tonal от Февраль 16, 2010, 09:23
Очевидно что первой и второй. Третья это черный ящик.
А второй почему? На машине 2 сетевые карточки и каждый поток будет слать по своей?  ;D
Ну а с первой нужно смотреть и мерить во что именно упирается скорость подготовки...

Короче всяко нужно сначала померить. :)

Ну и в базах обычно есть какие-то режимы или механизмы поддержки больших объёмов вставок. Но это нужно смотреть конкретно каждую базу.

П. С. В общем случае, мне кажется, с 2мя потоками ситуация скорее ухудшится так что без серьёзного профилирования я бы не стал их пускать. :)