Название: Совет по многопоточности при работе с базами.. Отправлено: 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мя потоками ситуация скорее ухудшится так что без серьёзного профилирования я бы не стал их пускать. :) |