2015-04-12 77 views
0

我正在建立与在线数据库的应用程序。数据库不在我的电脑上。它在myasp.net服务器上。重新创建表并填充大量数据SQL Server

我有两个问题:

  1. 该应用程序收集数据,并得到所有后,需要将数据发送到该在线数据库。我对任何解决方案都很开放,包括框架等,但我必须说在我的情况下,实体框架非常缓慢。我的数据收集应用程序创建带有插入值的文件。 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或其他任何内容。

  1. 每次在我插入第一点之前,我需要清除表格。我正在阅读有关缩小的内容,这不太好,所以我选择放弃并重新创建表格。在这个动作之后,没有更少的空间使用,但是当我用插入填充表格时,空间保持不变。我也不需要从这个表中回滚任何东西。这是好方法吗?或者也许截断表会更好?
+0

你有没有检查批量复制?例如:https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.aspx –

+0

检查此[问题](http://stackoverflow.com/questions/13722014/insert-2 -million - 行 - 为-SQL服务器很快)。 –

+0

我听说过大量复制。还没有测试过,但我真的会尝试。我现在的问题是为什么相同的'INSERT INTO'函数有这么大的时间差异? 我看到这篇文章Aleksandr,但谢谢:) – titol

回答

0

我听说过有时插入INTO VALUES对于许多行并不总是最快的。你有没有尝试过:

INSERT INTO yourTable 
SELECT 'Value1' 
UNION ALL 
SELECT 'Value2' 
UNION ALL 
SELECT 'value3 
etc... 
+1

我没有。我可能会试试这个,但正如我在我的问题中所说的那样,使用纯查询的INSERT INTO VALUES几乎比使用C#编码的同一查询快5倍。所以第一个问题是如何更快地创建C#代码。 也感谢这个信息:) – titol

0

我试过几种方法来做这个插入和sqlBulkCopy是最快的。我的代码是:

using (var sqlBulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.TableLock, transaction)) 
       { 
        sqlBulkCopy.BulkCopyTimeout = 600; 
        sqlBulkCopy.DestinationTableName = "daneProduktu"; 
        sqlBulkCopy.ColumnMappings.Add("numerProduktu", "numerProduktu"); 
        sqlBulkCopy.ColumnMappings.Add("numerSklepu", "numerSklepu"); 
        sqlBulkCopy.ColumnMappings.Add("cena", "cena"); 
        sqlBulkCopy.ColumnMappings.Add("pozycjaCeneo", "pozycjaCeneo"); 

        sqlBulkCopy.WriteToServer(dt); 
       } 

我也在这里使用SQL事务。 你们有些人可以说“使用批量大小”。我试过了,但是这个选项会使插入速度变慢。我必须说,我上传不好。我做了一些时间测量:

BatchSize in Time 
0 in 278768ms 
500 in 1207129ms 
1000 in 817399ms 
1500 in 629146ms 
2000 in 531632ms 
2500 in 480200ms 
3000 in 451510ms 
3500 in 446899ms 
4000 in 407875ms 
4500 in 405808ms 
5000 in 387078ms 
5500 in 360508ms 
10000 in 327231ms 
20000 in 305282ms 
30000 in 305936ms 
40000 in 304494ms 
50000 in 303541ms 
60000 in 303723ms 
80000 in 310058ms 
100000 in 297835ms 

正如你所看到的,0批量大小是最快的。

回答我有关INSERT INTO值(问题):

也许这一切都是关于通过互联网连接发送这些插件。在第一种情况下,我发送一个订单,并在SQL服务器上完成循环。在第二种情况下,可能我已向服务器发送了10个订单。

相关问题