Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как внести большое количество данных

18K
26 августа 2011 года
imAlex
179 / / 29.07.2010
Добрый день.
Пишу очередную программу. Одна из подзадач заключается в том, что необходимо в базу (MSSQL), в одну таблицу внести около 3000 записей сл. вида:
1 | линия | 2 | 18 | 199034.
Плюс есть поле ID (заполняется автоматически)

С ходу можно просто открыть соединение и по одному запросу на строку вносить данные. Или можно одним запросом ввести все данные. Или может еще какие способы есть.

Вопрос собственно в том, выдержит ли SQL и как лучше вносить?
277
26 августа 2011 года
arrjj
1.7K / / 26.01.2011
 
Код:
INSERT INTO table1 (field1,field2,...) VALUES (value01,value02,...),(value11,value12,...),(value21,value22,...)
244
26 августа 2011 года
UAS
2.0K / / 19.07.2006
Ну, одним запросом 3000 лучше сразу не вносить. Как вариант - за один запрос добавляйте 100-300 записей.
18K
26 августа 2011 года
imAlex
179 / / 29.07.2010
Спасибо за внимание.
Тат-как это будет делать программа, мне не имеет значение по скольку записей добавлять. Я могу хоть в цикле по одному или как предложил "UAS" по 100-300.

Вопрос в том, что для MSSQL более приемлемо?
5
26 августа 2011 года
hardcase
4.5K / / 09.08.2005
Цитата: imAlex

Вопрос собственно в том, выдержит ли SQL и как лучше вносить?


3000 - фигня (если нет тяжелых индексов). Копайте в сторону BULK INSERT. На время внесения этих данных БД можно переводить в Bulk-logged режим восстановления, дабы минимизировать рост журнала транзакций.

5
26 августа 2011 года
hardcase
4.5K / / 09.08.2005
Цитата: imAlex
Спасибо за внимание.
Тат-как это будет делать программа, мне не имеет значение по скольку записей добавлять. Я могу хоть в цикле по одному или как предложил "UAS" по 100-300.

Вопрос в том, что для MSSQL более приемлемо?

На самом деле зависит от режима работы с БД. Если запись в БД очень редки, то БД стоит перевести в "версионный" режим транзакций, это позволит выполнять чтение прежних данных без блокировок. В противном случае (дефолтный блокировочный алгоритм) нужно искать баланс между размерами вносимых данных и продолжительностью транзакции.

385
27 августа 2011 года
SomewherSomehow
477 / / 25.07.2004
UAS,
Ты хоть и ветеран, зачем отписываешь то и там где не понимаешь? (не в первый раз уже)

hardcase,
+1
отличные рекомендации, лучше и не скажешь!
ТС рекомендую к ним прислушаться!

П.с.
И вот еще, если приложение потом разрастется и надо будет вносить реально большие данные от нескольких миллионов - тынц

А вообще, на всякий случай, вторю hardcase, 3000 при заявленных даннх (не видео-аудио чай), нет сымсла искать производительных решений используйте стнадарт из документации. Ибо к чести майкрософт этой документации докуя =)
18K
28 августа 2011 года
imAlex
179 / / 29.07.2010
Спасибо.
Я попробовал вариант с BULK INSERT, однако наткнулся на проблему.
Я создал txt файл с данными. При вводе его в базу, проявляются проблемы с кодировкой. Файл сохранен в 1251.
Делаю так:
 
Код:
BULK INSERT dbo.TempIndex
FROM 'E:\www\temp.txt'
WITH (FIELDTERMINATOR =' | ', ROWTERMINATOR ='\r\n')

Подскажите в чем причина?
14
28 августа 2011 года
Phodopus
3.3K / / 19.06.2008
Цитата:
BULK INSERT
[ database_name. [ schema_name ] . | schema_name. ] [ table_name | view_name ]
FROM 'data_file'

[ WITH
(
[ [ , ] BATCHSIZE =batch_size ]
[ [ , ] CHECK_CONSTRAINTS ]
[ [ , ] CODEPAGE = { 'ACP' | 'OEM' | 'RAW' | 'code_page' } ]
[ [ , ] DATAFILETYPE =

{ 'char' | 'native'| 'widechar' | 'widenative' } ]
[ [ , ] FIELDTERMINATOR = 'field_terminator' ]
[ [ , ] FIRSTROW = first_row ]
[ [ , ] FIRE_TRIGGERS ]
[ [ , ] FORMATFILE ='format_file_path' ]
[ [ , ] KEEPIDENTITY ]
[ [ , ] KEEPNULLS ]
[ [ , ] KILOBYTES_PER_BATCH =kilobytes_per_batch ]
[ [ , ] LASTROW =last_row ]
[ [ , ] MAXERRORS =max_errors ]
[ [ , ] ORDER ( { column [ ASC | DESC ] } [ ,...n ] ) ]
[ [ , ] ROWS_PER_BATCH =rows_per_batch ]
[ [ , ] ROWTERMINATOR ='row_terminator' ]
[ [ , ] TABLOCK ]
[ [ , ] ERRORFILE ='file_name' ]
)]


я полагаю

385
29 августа 2011 года
SomewherSomehow
477 / / 25.07.2004
Цитата: imAlex
Спасибо.
Я попробовал вариант с BULK INSERT, однако наткнулся на проблему.
Я создал txt файл с данными. При вводе его в базу, проявляются проблемы с кодировкой. Файл сохранен в 1251.
Делаю так:
 
Код:
BULK INSERT dbo.TempIndex
FROM 'E:\www\temp.txt'
WITH (FIELDTERMINATOR =' | ', ROWTERMINATOR ='\r\n')

Подскажите в чем причина?



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

[ATTACH]5293[/ATTACH]

Код:
use tempdb
go
create table t(a varchar(10) collate Latin1_General_CI_AS , b nvarchar(10))
go
bulk insert dbo.t
from 'c:\temp.txt'
with (FIELDTERMINATOR =' | ', ROWTERMINATOR ='\n', CODEPAGE=1251)
go
select * from t
go
drop table t

результат:
[ATTACH=CONFIG]5294[/ATTACH]
Соотв.решение, либо использовать соответсвующий колейшн, либо юникодный тип поля. Ну и про кодовую страницу не забывайте, как тут уже сказали.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог