2015-04-12 88 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個訂單。

相關問題