Страницы

Поиск по вопросам

среда, 4 декабря 2019 г.

Как загрузить в базу данных большое количество записей?

#c_sharp #net #sql_server


В приложении создается 100 тыс. записей. Их надо загрузить в базу данных в SQL Server.
Как это можно сделать быстро?
    


Ответы

Ответ 1



Например, в SQL Server создана таблица data create table [data] (id int identity primary key, val int) Для быстрой загрузки 100 тыс. строк из приложения можно использовать SqlBulkCopy. Таблица загружается менее чем за 5 сек. using System.Data.SqlClient; using System.Data; void Upload() { var sw = System.Diagnostics.Stopwatch.StartNew(); var co = new SqlConnection( @"Data Source = (localdb)\MSSQLLocalDB; Initial Catalog = Test;"); var da = new SqlDataAdapter("select * from data", co); var dt = new DataTable(); da.FillSchema(dt, SchemaType.Source); var c = dt.Columns["val"]; for (var i = 0; i < 100000; i++) { var r = dt.NewRow(); r[c] = i; dt.Rows.Add(r); } dt.AcceptChanges(); var bc = new SqlBulkCopy(co) { DestinationTableName = "data" }; try { co.Open(); bc.WriteToServer(dt); sw.Stop(); MessageBox.Show("upload completed " + sw.ElapsedMilliseconds); } catch (Exception exc) { MessageBox.Show(exc.ToString()); } finally { co.Dispose(); bc.Close(); } }

Ответ 2



Если база данных находится в SQL Server Compact (бесплатная встраиваемая БД; до 4 ГБ), то можно использовать метод ExecuteResultSet. Ниже пример, который создает базу данных Test.sdf и таблицу data. 100 тыс. строк загружаются в таблицу data примерно за 2 сек. // #r "System.Data.SqlServerCe.dll" using System.Data; using System.Data.SqlServerCe; void UploadSdf() { var sdf = @"C:\Temp\Test.sdf"; var co = new SqlCeConnection(@"Data Source=" + sdf); if (!System.IO.File.Exists(sdf)) { var ce = new SqlCeEngine(co.ConnectionString); ce.CreateDatabase(); co.Open(); var cmd = co.CreateCommand(); cmd.CommandText = "create table data (id int identity primary key, val int)"; cmd.ExecuteNonQuery(); } else co.Open(); var sw = System.Diagnostics.Stopwatch.StartNew(); try { var cmd = co.CreateCommand(); cmd.CommandText = "data"; // имя таблицы cmd.CommandType = CommandType.TableDirect; var rso = ResultSetOptions.Updatable | ResultSetOptions.Scrollable; using (var ers = cmd.ExecuteResultSet(rso)) { var vi = ers.GetOrdinal("val"); for (int i = 0; i < 100000; i++) { var rc = ers.CreateRecord(); rc.SetValue(vi, i); ers.Insert(rc, DbInsertOptions.PositionOnInsertedRow); } } sw.Stop(); MessageBox.Show("upload completed " + sw.ElapsedMilliseconds); } catch (Exception exc) { MessageBox.Show(exc.ToString()); } finally { co.Dispose(); } }

Ответ 3



Позволю себе дополнить ответы коллег т.к. никто из них не говорит о том что можно сделать на стороне SQL Server, мои рекомендации: на время загрузки данных можно перевести БД в режим восстановления Simple USE master; ALTER DATABASE [YouDatabase] SET RECOVERY SIMPLE; включить флаг 610 (управляет вставками с минимальным протоколированием). DBCC TRACEON (610,-1); Подробнее: Флаги трассировки, Минимальное протоколирование операций.

Комментариев нет:

Отправить комментарий