2012-11-19 104 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#代码运行它类似的结果”! –