我正在建立与在线数据库的应用程序。数据库不在我的电脑上。它在myasp.net服务器上。重新创建表并填充大量数据SQL Server
我有两个问题:
该应用程序收集数据,并得到所有后,需要将数据发送到该在线数据库。我对任何解决方案都很开放,包括框架等,但我必须说在我的情况下,实体框架非常缓慢。我的数据收集应用程序创建带有插入值的文件。 F.e:
(4880775 , 18196 , 9 , 1), (4880775 , 9026 , 8.49 , 2), (4880775 , 4009 , 9.99 , 3),
此文件可能(将来)至少有10万行。我做了两个测试。一种是使用纯SQL查询插入十倍990行(在VS 2013右击数据库 - >新查询),这是这样的:
declare @i int set @i = 0 while @i < 10 begin set @i += 1 INSERT INTO daneProduktu VALUES (4880775 , 18196 , 9 , 1), (4880775 , 9026 , 8.49 , 2), (4880775 , 4009 , 9.99 , 3), ... ... end
而第二个选项是做使用同样的事情C#代码。我已经使用实体框架
using (var context = new sklepyEntities())
{
context.Database.ExecuteSqlCommand(sb.ToString());
}
和SqlCommand对象
using (SqlCommand cmd = new SqlCommand(sb.ToString(), connection))
{
cmd.ExecuteNonQuery();
}
为C#
SqlCommand
的完整代码:
Stopwatch st = new Stopwatch();
st.Start();
for (int i = 0; i < 10; i++)
{
sb.Clear();
sb.Append("INSERT INTO daneProduktu VALUES ");
r = new StreamReader(sciezka);
while ((line = r.ReadLine()) != null)
{
licznik++;
sb.Append(Environment.NewLine);
sb.Append(line);
}
sb.Length--;
sb.Append(";");
using (SqlCommand cmd = new SqlCommand(sb.ToString(), connection))
{
cmd.ExecuteNonQuery();
}
}
sb.Length--;
sb.Append(";");
using (SqlCommand cmd = new SqlCommand(sb.ToString(), connection))
{
cmd.ExecuteNonQuery();
}
st.Stop();
两者都是工作,但它是如此之慢..
比较时间:
- 纯SQL查询 - 使用
SqlCommand
〜3秒 - C#SQL - 〜13S
有特殊与990个插入值准备文件。我在两种情况下都使用相同的值。
为什么使用选项的代码太慢?有什么办法可以让它更快吗?使用纯插入物的OFC不仅是选择。我可以做任何事情。如果这可能会更快,我可以为此准备XML文件,csv或其他任何内容。
- 每次在我插入第一点之前,我需要清除表格。我正在阅读有关缩小的内容,这不太好,所以我选择放弃并重新创建表格。在这个动作之后,没有更少的空间使用,但是当我用插入填充表格时,空间保持不变。我也不需要从这个表中回滚任何东西。这是好方法吗?或者也许截断表会更好?
你有没有检查批量复制?例如:https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.aspx –
检查此[问题](http://stackoverflow.com/questions/13722014/insert-2 -million - 行 - 为-SQL服务器很快)。 –
我听说过大量复制。还没有测试过,但我真的会尝试。我现在的问题是为什么相同的'INSERT INTO'函数有这么大的时间差异? 我看到这篇文章Aleksandr,但谢谢:) – titol