Как внести большое количество данных
Пишу очередную программу. Одна из подзадач заключается в том, что необходимо в базу (MSSQL), в одну таблицу внести около 3000 записей сл. вида:
1 | линия | 2 | 18 | 199034.
Плюс есть поле ID (заполняется автоматически)
С ходу можно просто открыть соединение и по одному запросу на строку вносить данные. Или можно одним запросом ввести все данные. Или может еще какие способы есть.
Вопрос собственно в том, выдержит ли SQL и как лучше вносить?
Тат-как это будет делать программа, мне не имеет значение по скольку записей добавлять. Я могу хоть в цикле по одному или как предложил "UAS" по 100-300.
Вопрос в том, что для MSSQL более приемлемо?
Вопрос собственно в том, выдержит ли SQL и как лучше вносить?
3000 - фигня (если нет тяжелых индексов). Копайте в сторону BULK INSERT. На время внесения этих данных БД можно переводить в Bulk-logged режим восстановления, дабы минимизировать рост журнала транзакций.
Тат-как это будет делать программа, мне не имеет значение по скольку записей добавлять. Я могу хоть в цикле по одному или как предложил "UAS" по 100-300.
Вопрос в том, что для MSSQL более приемлемо?
На самом деле зависит от режима работы с БД. Если запись в БД очень редки, то БД стоит перевести в "версионный" режим транзакций, это позволит выполнять чтение прежних данных без блокировок. В противном случае (дефолтный блокировочный алгоритм) нужно искать баланс между размерами вносимых данных и продолжительностью транзакции.
Ты хоть и ветеран, зачем отписываешь то и там где не понимаешь? (не в первый раз уже)
hardcase,
+1
отличные рекомендации, лучше и не скажешь!
ТС рекомендую к ним прислушаться!
П.с.
И вот еще, если приложение потом разрастется и надо будет вносить реально большие данные от нескольких миллионов - тынц
А вообще, на всякий случай, вторю hardcase, 3000 при заявленных даннх (не видео-аудио чай), нет сымсла искать производительных решений используйте стнадарт из документации. Ибо к чести майкрософт этой документации докуя =)
Я попробовал вариант с BULK INSERT, однако наткнулся на проблему.
Я создал txt файл с данными. При вводе его в базу, проявляются проблемы с кодировкой. Файл сохранен в 1251.
Делаю так:
FROM 'E:\www\temp.txt'
WITH (FIELDTERMINATOR =' | ', ROWTERMINATOR ='\r\n')
Подскажите в чем причина?
[ 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' ]
)]
я полагаю
Я попробовал вариант с BULK INSERT, однако наткнулся на проблему.
Я создал txt файл с данными. При вводе его в базу, проявляются проблемы с кодировкой. Файл сохранен в 1251.
Делаю так:
FROM 'E:\www\temp.txt'
WITH (FIELDTERMINATOR =' | ', ROWTERMINATOR ='\r\n')
Подскажите в чем причина?
А как вы определяете, что проблема с кодировкой? Делаете потом селект из таблицы и видите кракозябры?
Если так, то может быть дело в типе данных поля, а точнее в его коллейшне, вот вам простой пример:
[ATTACH]5293[/ATTACH]
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]
Соотв.решение, либо использовать соответсвующий колейшн, либо юникодный тип поля. Ну и про кодовую страницу не забывайте, как тут уже сказали.