Для вставки огромного количества данных в SQL в одном
Linq или SqlCommand, не предназначены для массового копирования данных в SQL .
Вы можете использовать класс SqlBulkCopy , который обеспечивает управляемый доступ к утилите bcp для массовой загрузки данных в Sql практически из любого источника данных.
Можно использовать класс SqlBulkCopyзаписывать данные только в таблицы SQL Server.Однако источник данных не ограничивается SQL Server;может использоваться любой источник данных, если данные могут быть загружены в экземпляр DataTable или считаны с экземпляром IDataReader.
Сравнение производительности
SqlBulkCopyявляется самым быстрым, даже при загрузке данных из простого файла CSV.
Linq просто сгенерирует загрузку Insert
операторов в SQL и отправит их на ваш SQL Server.Это ничем не отличается от того, что вы используете специальные запросы с SqlCommand
.Производительность SqlCommand и Linq практически идентична.
Доказательство
(SQL Express 2008, .Net 4.0)
SqlBulkCopy
Использование SqlBulkCopy для загрузки 100000 строк из файла CSV (включая загрузку данных)
using (SqlConnection conn = new SqlConnection("Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=EffectCatalogue;Data Source=.\\SQLEXPRESS;"))
{
conn.Open();
Stopwatch watch = Stopwatch.StartNew();
string csvConnString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\data\\;Extended Properties='text;'";
OleDbDataAdapter oleda = new OleDbDataAdapter("SELECT * FROM [test.csv]", csvConnString);
DataTable dt = new DataTable();
oleda.Fill(dt);
using (SqlBulkCopy copy = new SqlBulkCopy(conn))
{
copy.ColumnMappings.Add(0, 1);
copy.ColumnMappings.Add(1, 2);
copy.DestinationTableName = "dbo.Users";
copy.WriteToServer(dt);
}
Console.WriteLine("SqlBulkCopy: {0}", watch.Elapsed);
}
SqlCommand
using (SqlConnection conn = new SqlConnection("Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=TestDb;Data Source=.\\SQLEXPRESS;"))
{
conn.Open();
Stopwatch watch = Stopwatch.StartNew();
SqlCommand comm = new SqlCommand("INSERT INTO Users (UserName, [Password]) VALUES ('Simon', 'Password')", conn);
for (int i = 0; i < 100000; i++)
{
comm.ExecuteNonQuery();
}
Console.WriteLine("SqlCommand: {0}", watch.Elapsed);
}
LinqToSql
using (SqlConnection conn = new SqlConnection("Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=TestDb;Data Source=.\\SQLEXPRESS;"))
{
conn.Open();
Stopwatch watch = Stopwatch.StartNew();
EffectCatalogueDataContext db = new EffectCatalogueDataContext(conn);
for (int i = 0; i < 100000; i++)
{
User u = new User();
u.UserName = "Simon";
u.Password = "Password";
db.Users.InsertOnSubmit(u);
}
db.SubmitChanges();
Console.WriteLine("Linq: {0}", watch.Elapsed);
}
Результаты
SqlBulkCopy: 00:00:02.90704339
SqlCommand: 00:00:50.4230604
Linq: 00:00:48.7702995