2012-11-19 107 views
0

我最近建立了一個應用程序來測試寫入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秒。我知道數據庫需要更長的時間,但是有什麼辦法可以加快速度?

回答

2

可能的選項...

  1. 使用交易(做每筆交易多插入)

  2. 使用SqlBulkCopy API

+0

因此,在未來,我們計劃做不同的事情插入,所以我只是想辦法加快插入或一般的數據庫(如果多數民衆贊成可能) – Badmiral

+0

如果「不同的事情」,你的意思是多個表,同建議仍然適用。單個事務可能包含多個表的DML語句。在'SqlBulkCopy'的情況下,你必須爲每個表執行一個單獨的語句。所以,舉個例子,如果你有5個表,你可以執行5個SqlBulkCopy操作。在這兩種情況下,其基本思想是批量插入,以便最大限度地減少鎖定和事務日誌的開銷。 – cbranch

+0

哎呀抱歉,應該更清楚。我的意思是說,它不會被插入「測試」了個遍,將它插入各種字符串和整數的,這似乎是它不會對使用SqlBulkCopy – Badmiral

0

是的,做它作爲一個單一的INSERT語句,而不是很多。

INSERT INTO TestTable VALUES ('Test'), ('Test'), ('Test') ...."; 
+0

最多有1000行是可以用這種方式插入,[它實際上可能會慢一些。](http://stackoverflow.com/q/8635818/732 26) –

+0

該文章沒有考慮CreateCommand或ExecuteNonQuery,因爲這是在循環內完成的。我認爲這是值得一試的,因爲它不會花費很長時間在有關條件下進行測試。 –

+0

有說OP短串像'有很多重複的東西可能會更好,雖然的test'「我使用的SqlClient,這更加suprising考慮所有的DAL層往返了從C#代碼運行它類似的結果」! –