我正在建立與在線數據庫的應用程序。數據庫不在我的電腦上。它在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