Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как быстро вставить много строк? java + mssql 
V
    Опции темы
BegemotX2
Дата 2.11.2007, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 13.11.2005

Репутация: нет
Всего: 1



Товарищи, подскажите нормальный способ, как в связке java+mssql быстрее всего вставить много строк. 
PreparedStatement, Statement.addBatch/executeBatch, Statement.executeUpdate?
или есть еще какие-нить способы?

"Много" - это 3 варианта:
   50,
   1000,
   20 000 000

Если есть различия, хорошо бы знать оптимальный способ для каждого варианта.

Заранее Спасибо.
PM MAIL   Вверх
LSD
Дата 2.11.2007, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15708
Регистрация: 24.3.2004

Репутация: нет
Всего: 537



1. 50 это не много.

2. Со стороны Java используй addBatch/executeBatch. Что использовать со стороны сервера я не в курсе (разве, что индексы отключить на время).


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
LSD
Дата 2.11.2007, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15708
Регистрация: 24.3.2004

Репутация: нет
Всего: 537




M
LSD
Перенесено их баз данных



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
archimed7592
Дата 2.11.2007, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: нет
Всего: 93



Цитата(BegemotX2 @  2.11.2007,  17:09 Найти цитируемый пост)
mssql быстрее всего вставить много строк.

bulk insert, если я не ошибаюсь.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Servena
Дата 2.11.2007, 19:14 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 251
Регистрация: 24.7.2007
Где: Днепропетровск

Репутация: 10
Всего: 14



smile  Я думаю, это еще один "умник модератор или кактамеще" опять прочитал незнакомое слово и переместил тему с Джавы сюда.

Хочу знать имя, если это так (одного уже знаю, это stab).
PM MAIL   Вверх
archimed7592
Дата 2.11.2007, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: нет
Всего: 93



Цитата(Servena @  2.11.2007,  19:14 Найти цитируемый пост)
 Я думаю, это еще один "умник модератор или кактамеще" опять прочитал незнакомое слово и переместил тему с Джавы сюда.

Вопрос по базе данных, а не по Java - какие проблемы? 0_о


Цитата(Servena @  2.11.2007,  19:14 Найти цитируемый пост)
Хочу знать имя, если это так

У тебя плохо со зрением? Это сделал LSD(и правильно сделал) и двумя постами выше это очень хорошо видно:
Цитата(LSD @  2.11.2007,  17:40 Найти цитируемый пост)
М LSD    Перенесено их баз данных



--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Servena
Дата 2.11.2007, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 251
Регистрация: 24.7.2007
Где: Днепропетровск

Репутация: 10
Всего: 14



Судя из вопроса понятно, что вставлять будут из Джава - так пусть обсуждается "мат часть" джавы по работе с этой БД. Ведь для этого все равно будут использоваться какие-нибудь драйвера (типа ОДБС для Джава). 

Но конечно, есть и работа для администратора БД - приготовить ее к вставке большого объема данных(но это не обязательно).
PM MAIL   Вверх
archimed7592
Дата 3.11.2007, 01:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: нет
Всего: 93



Servena, а какая разница откуда вставлять? Хоть из VB - строка "bulk insert ..." не будет сильно отличаться от языка к языку.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Servena
Дата 3.11.2007, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 251
Регистрация: 24.7.2007
Где: Днепропетровск

Репутация: 10
Всего: 14



 smile 
Нет, я пытаюсь донести другую мысль.
Некто, BegemotX2 захотел узнать что-то и выставил свой пост в интересующей его теме.
Тут появляется "продвинутый" ЛСД - отвечает, и потом (судя по всему, он считает что дал полный, абсолютный ответ) двигает тему.

Да, конечно, это его право. Но нужно вникнуть глубже, не отделять тему от человека, подождать других ответов и немного
во времени (а не 20 мин.) - т.е. проявить терпимость и уважение к человеку.

PM MAIL   Вверх
LSD
Дата 3.11.2007, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15708
Регистрация: 24.3.2004

Репутация: нет
Всего: 537




M
LSD
1. Обсуждать действия модераторов, можно только в соответсвующем разделе.
2. Грубить другим участникам нельзя, тем более модераторам.
Итого: read-only на 2 дня.


По сути вопроса: BegemotX2 разместил тему не в разделе Java, а в разделе Общие вопросы по базам данных. Оптимизацию вставки данных можно проводить с обоих сторон, со стороны Java это addBatch/executeBatch, со стороны SQL Server это bulk insert. Одно другому не мешает. Раз авторо разместил вопрос в Общие вопросы по базам данных значит его интересует в первую очередь оптимизация со стороны СУБД, а это уже вопрос по SQL Server, куда я и переместил тему.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
BegemotX2
Дата 5.11.2007, 02:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 13.11.2005

Репутация: нет
Всего: 1



Лан, товарищи, большое спасибо. Кой-че узнал, а потом проорался с ваших пререканий. 

Просто увидел в одном C# проекте конструкцию 
   using (SqlBulkCopy copy = new SqlBulkCopy(this.conn))...
которая в итоге работала быстрее, чем тот же Statement.excuteUpdate в java

но java ни о каком SqlBulkCopy не слышала, а 20 000 000 строк вставить надо. Заинтересовало, как. А вы тут базар развели.


PS: какая по сути разница, где тема, если в старом разделе ссылка осталась?
PM MAIL   Вверх
archimed7592
Дата 5.11.2007, 05:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: нет
Всего: 93



Цитата(BegemotX2 @  5.11.2007,  02:24 Найти цитируемый пост)
но java ни о каком SqlBulkCopy не слышала

Библиотека для C# писана микрософтом и ессно в ней есть полноценная поддержка микрософтовской СУБД.
Что же касается java - я уверен, что там должна быть возможность сделать примерно так:
Код

String q = "bulk insert ...";
// ...
query.text = q;
query.execute();

т.е. сформировать запрос руками.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
BegemotX2
Дата 6.11.2007, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 13.11.2005

Репутация: нет
Всего: 1



Насколько я знаю, BULK INSERT выполняет загрузку из файла. 
хотя это как вариант.

На всякий случай поделюсь, что сделал я.
1. удалил индексы.
2. отключил автоматическое подтверждение транзакций Connection.setAutoCommit(false)
3. использовал PreparedStatement 
Код

   PreparedStatement ps = ...   
   while(..){
      ...
      ps.setInt(...);
      ps.setTimestamp(...);
      ....
      ps.addBatch();
     currentBatch++;
      if( currentBatch == 100 ){
             ps.executeBatch();
             ps.clearWarnings();
             currentBatch = 0;
     }
   }

4. раз в 2000 строк выполнял Connection.commit()


В результате 50млн (не 20млн) строк вставились за 6 часов на athlon 2000, 768mb

Это сообщение отредактировал(а) BegemotX2 - 6.11.2007, 23:18
PM MAIL   Вверх
kat_ru
Дата 20.5.2018, 02:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Другого не будет



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 16.1.2007
Где: Moscow City

Репутация: нет
Всего: нет



трололо всем. Не хочу создавать новую тему, имхо эта, более чем подходит для моего почти аналогичного вопроса.  Суть - хочу понять, есть ли что то (рецепты), что поможет ускорить процесс, который описываю ниже.
Для начала. Имеется определение: решение без извращений тупо на sql, т.к. к примеру, связку c# и sql уже опробовал и огорчился.

Что нужно: все что угодно, что реально поможет ускорить выполнение простого кода обработки !большого объема записей.
А именно: сначала нужно сформировать табличку - массив числовых значений от 0.0000000000000000 до 0.9999999999999999.

Не придумал и не нашел ничего быстрее чем:

Код

declare @i decimal(17,16)
declare @Start decimal(17,16)
declare @End decimal(17,16)

set @Start = 0.0000000000000000
set @End = 0.9999999999999999
set @i = @Start

while @i<=@End
 begin
   
   insert into decdata
   select @i

  set @i=@i+0.0000000000000001

  end



У товарища "BegemotX2" - 
Цитата

50млн (не 20млн) строк вставились за 6 часов на athlon 2000, 768mb


Вопрос, КАК?!  Хочу также, имхо на i3-2350m, 8.00Gb максимум выжимается 3 млн записей в час, а чем дальше в лес... ну например тут: 0.0000000130075191 - со скоростями, уже все стало "не очень"... быстрее сцеплять таблицу основного массива с временно создаваемой таблицей на 50 млн. строк..

Посоветуйте пжл., что нибудь от головы. Ибо, мне еще пригодится (в последующем) над этой таблицей, проводить update всех строк, с конвертацией decimal (17,16) в varchar (29), по причине того, что последовательность decimal (17,16) в моем случае "переменная".

корень 2008 r2

Спасибо.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "MS SQL"
Akina

Akina

Запрещается!

Публиковать ссылки и обсуждать взлом чего бы то ни было.

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы составления неспецифических запросов рассматриваются здесь
  • Используйте теги [code=sql][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, Akina.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MS SQL Server | Следующая тема »


 




[ Время генерации скрипта: 0.1706 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.