我最近建立了一個應用程序來測試寫入10萬株到一個文本文件和100000插入到數據庫優化插入查詢2008
這之間的速度差是代碼
private void RunTestBtn_Click(object sender, RoutedEventArgs e)
{
Stopwatch FFtimer = new Stopwatch();
FFtimer.Start();
RunFFTest();
FFtimer.Stop();
TimeSpan FFts = FFtimer.Elapsed;
string FFelapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
FFts.Hours, FFts.Minutes, FFts.Seconds,
FFts.Milliseconds/10);
FFLabel.Content = "Flat File: " + FFelapsedTime;
Stopwatch Datatimer = new Stopwatch();
Datatimer.Start();
DataFFTest();
Datatimer.Stop();
TimeSpan Datats = Datatimer.Elapsed;
string DataelapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
Datats.Hours, Datats.Minutes, Datats.Seconds,
Datats.Milliseconds/10);
DBLabel.Content = "Database: " + DataelapsedTime;
}
void RunFFTest()
{
using(StreamWriter writer = new StreamWriter(@"F:\test\FFtest.txt"))
{
for(int i = 0; i< 100000; i++)
{
writer.WriteLine("test");
}
}
}
void DataFFTest()
{
using (SqlConnection conn = new SqlConnection("Data Source=EMMY;Initial Catalog=MyDB;User Id=SqlServiceUser;Password=MyPassword;"))
{
conn.Open();
for (int i = 0; i < 100000; i++)
{
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "INSERT INTO TestTable VALUES ('Test')";
cmd.ExecuteNonQuery();
}
}
}
}
的心臟
最終的結果是,平面文件寫了1毫秒和SQL插入花了9分鐘,41秒。我知道數據庫需要更長的時間,但是有什麼辦法可以加快速度?
因此,在未來,我們計劃做不同的事情插入,所以我只是想辦法加快插入或一般的數據庫(如果多數民衆贊成可能) – Badmiral
如果「不同的事情」,你的意思是多個表,同建議仍然適用。單個事務可能包含多個表的DML語句。在'SqlBulkCopy'的情況下,你必須爲每個表執行一個單獨的語句。所以,舉個例子,如果你有5個表,你可以執行5個SqlBulkCopy操作。在這兩種情況下,其基本思想是批量插入,以便最大限度地減少鎖定和事務日誌的開銷。 – cbranch
哎呀抱歉,應該更清楚。我的意思是說,它不會被插入「測試」了個遍,將它插入各種字符串和整數的,這似乎是它不會對使用SqlBulkCopy – Badmiral