| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > MS SQL Server > Как быстро вставить много строк? |
| Автор: BegemotX2 2.11.2007, 17:09 |
| Товарищи, подскажите нормальный способ, как в связке java+mssql быстрее всего вставить много строк. PreparedStatement, Statement.addBatch/executeBatch, Statement.executeUpdate? или есть еще какие-нить способы? "Много" - это 3 варианта: 50, 1000, 20 000 000 Если есть различия, хорошо бы знать оптимальный способ для каждого варианта. Заранее Спасибо. |
| Автор: LSD 2.11.2007, 17:40 |
| 1. 50 это не много. 2. Со стороны Java используй addBatch/executeBatch. Что использовать со стороны сервера я не в курсе (разве, что индексы отключить на время). |
| Автор: LSD 2.11.2007, 17:40 | ||
|
| Автор: archimed7592 2.11.2007, 18:56 |
bulk insert, если я не ошибаюсь. |
| Автор: Servena 2.11.2007, 19:14 |
Хочу знать имя, если это так (одного уже знаю, это stab). |
| Автор: Servena 2.11.2007, 19:32 |
| Судя из вопроса понятно, что вставлять будут из Джава - так пусть обсуждается "мат часть" джавы по работе с этой БД. Ведь для этого все равно будут использоваться какие-нибудь драйвера (типа ОДБС для Джава). Но конечно, есть и работа для администратора БД - приготовить ее к вставке большого объема данных(но это не обязательно). |
| Автор: archimed7592 3.11.2007, 01:17 |
| Servena, а какая разница откуда вставлять? Хоть из VB - строка "bulk insert ..." не будет сильно отличаться от языка к языку. |
| Автор: Servena 3.11.2007, 11:45 |
| Нет, я пытаюсь донести другую мысль. Некто, BegemotX2 захотел узнать что-то и выставил свой пост в интересующей его теме. Тут появляется "продвинутый" ЛСД - отвечает, и потом (судя по всему, он считает что дал полный, абсолютный ответ) двигает тему. Да, конечно, это его право. Но нужно вникнуть глубже, не отделять тему от человека, подождать других ответов и немного во времени (а не 20 мин.) - т.е. проявить терпимость и уважение к человеку. |
| Автор: LSD 3.11.2007, 20:15 | ||
По сути вопроса: BegemotX2 разместил тему не в разделе Java, а в разделе Общие вопросы по базам данных. Оптимизацию вставки данных можно проводить с обоих сторон, со стороны Java это addBatch/executeBatch, со стороны SQL Server это bulk insert. Одно другому не мешает. Раз авторо разместил вопрос в Общие вопросы по базам данных значит его интересует в первую очередь оптимизация со стороны СУБД, а это уже вопрос по SQL Server, куда я и переместил тему. |
| Автор: BegemotX2 5.11.2007, 02:24 |
| Лан, товарищи, большое спасибо. Кой-че узнал, а потом проорался с ваших пререканий. Просто увидел в одном C# проекте конструкцию using (SqlBulkCopy copy = new SqlBulkCopy(this.conn))... которая в итоге работала быстрее, чем тот же Statement.excuteUpdate в java но java ни о каком SqlBulkCopy не слышала, а 20 000 000 строк вставить надо. Заинтересовало, как. А вы тут базар развели. PS: какая по сути разница, где тема, если в старом разделе ссылка осталась? |
| Автор: archimed7592 5.11.2007, 05:05 | ||
Библиотека для C# писана микрософтом и ессно в ней есть полноценная поддержка микрософтовской СУБД. Что же касается java - я уверен, что там должна быть возможность сделать примерно так:
т.е. сформировать запрос руками. |
| Автор: BegemotX2 6.11.2007, 23:13 | ||
| Насколько я знаю, BULK INSERT выполняет загрузку из файла. хотя это как вариант. На всякий случай поделюсь, что сделал я. 1. удалил индексы. 2. отключил автоматическое подтверждение транзакций Connection.setAutoCommit(false) 3. использовал PreparedStatement
4. раз в 2000 строк выполнял Connection.commit() В результате 50млн (не 20млн) строк вставились за 6 часов на athlon 2000, 768mb |
| Автор: kat_ru 20.5.2018, 02:55 | ||||
| трололо всем. Не хочу создавать новую тему, имхо эта, более чем подходит для моего почти аналогичного вопроса. Суть - хочу понять, есть ли что то (рецепты), что поможет ускорить процесс, который описываю ниже. Для начала. Имеется определение: решение без извращений тупо на sql, т.к. к примеру, связку c# и sql уже опробовал и огорчился. Что нужно: все что угодно, что реально поможет ускорить выполнение простого кода обработки !большого объема записей. А именно: сначала нужно сформировать табличку - массив числовых значений от 0.0000000000000000 до 0.9999999999999999. Не придумал и не нашел ничего быстрее чем:
У товарища "BegemotX2" -
Вопрос, КАК?! Хочу также, имхо на i3-2350m, 8.00Gb максимум выжимается 3 млн записей в час, а чем дальше в лес... ну например тут: 0.0000000130075191 - со скоростями, уже все стало "не очень"... быстрее сцеплять таблицу основного массива с временно создаваемой таблицей на 50 млн. строк.. Посоветуйте пжл., что нибудь от головы. Ибо, мне еще пригодится (в последующем) над этой таблицей, проводить update всех строк, с конвертацией decimal (17,16) в varchar (29), по причине того, что последовательность decimal (17,16) в моем случае "переменная". корень 2008 r2 Спасибо. |