2012-04-27 24 views
4

我有SQL Server CE 3.5数据库。我运行以下代码:SQL Server CE性能,从表中选择需要8s的7000条记录

private void Load(string sql) 
{ 
    if (connection.State != ConnectionState.Open) 
    connection.Open(); 
    SqlCeDataAdapter sqlCeDataAdapter = new SqlCeDataAdapter(sql, connection); 

    Stopwatch watch = new Stopwatch(); 

    DataSet dataSet = new DataSet(); 
    try 
    { 
    Cursor.Current = Cursors.WaitCursor; 
    watch.Start(); 

    sqlCeDataAdapter.Fill(dataSet, "items"); 
    sqlCeDataAdapter.Dispose(); 

    var myBind = new BindingSource(dataSet, "items"); 
    grid.DataSource = myBind; 
    } 
    finally 
    { 
    watch.Stop(); 
    Cursor.Current = Cursors.Default; 
    MessageBox.Show(watch.ElapsedMilliseconds.ToString()); 
    }  
} 

Load ("select a1, a2 from table"); 

SQL Server CE或者它应该更快加载吗?

我该怎么做才能让这个选择更快?

当我使用与其它表连接,时间显着长大......

编辑:

我改变了以下新版本的代码,但还是7.5秒。 ...

private void Load2 (string sql) 
{ 
    if (connection.State != System.Data.ConnectionState.Open) 
    { 
    connection.Open(); 
    } 

    using (SqlCeCommand command = new SqlCeCommand(sql, connection)) 
    { 
    Stopwatch watch = new Stopwatch(); 

    Cursor.Current = Cursors.WaitCursor; 
    watch.Start(); 
    using (SqlCeDataReader reader = command.ExecuteReader()) 
    { 
     DataSet dataSet = new DataSet(); 

     dataSet.Tables.Add("items"); 

     dataSet.Tables["items"].Columns.Add("s1"); 
     dataSet.Tables["items"].Columns.Add("s2"); 

     while (reader.Read()) 
     { 
     string s1 = reader.GetString(0); 
     string s2 = reader.GetString(1); 

     dataSet.Tables["items"].Rows.Add(s1, s2); 
     } 
     watch.Stop(); 
     Cursor.Current = Cursors.Default; 
     MessageBox.Show(watch.ElapsedMilliseconds.ToString()); 

     BindingSource binding = new BindingSource(dataSet, "items"); 
     grid.DataSource = binding; 
    } 
    } 
} 
+0

发布您的查询 – Diego 2012-04-27 11:05:36

+0

它是:从表a中选择a.column1,a.column2 – John 2012-04-27 11:08:09

+0

@your编辑,您还必须了解自从使用SQL CE以来还有其他限制因素,如磁盘IO,而且您不有一台服务器用任何优化或负载平衡来处理SQL事务。 – 2012-04-27 11:28:58

回答

2

SqlCeDataAdapter.Fill(...)只是出了名的慢。如果您确实需要这种性能,您需要使用SqlCeDataReader来代替。

private void Load(string sql) { 
    if (connection.State != System.Data.ConnectionState.Open) { 
     connection.Open(); 
    } 

    using (SqlCeCommand command = new SqlCeCommand(sql, connection)) { 
     using (SqlCeDataReader reader = command.ExecuteReader()) { 
      DataSet dataSet = new DataSet(); 

      dataSet.Tables.Add("items"); 

      while (reader.Read()) { 
       DataRow row = dataSet.Tables["items"].NewRow(); 
       // fill your row 

       dataSet.Tables["items"].Rows.Add(row); 
      } 

      BindingSource binding = new BindingSource(dataSet, "items"); 
      grid.DataSource = binding; 
     } 
    } 
} 

当然,添加你的错误处理,并根据你的喜好进行清理。还有Entity Framework,与DbDataAdapter实施相比,它的性能不错。

由于您使用的是SqlCe,因此您还有其他限制因素,例如磁盘IO,并且您没有服务器通过任何优化处理SQL事务。

+0

感谢您的回答。我已经改变了你的版本的代码,但我仍然得到7.5秒...我编辑了我的文章,你可以看到我是如何改变它.. – John 2012-04-27 11:27:52

+0

它可能是你的磁盘IO限制你。在我的机器上,我能够在大约2秒内处理7000条记录。使用SqlCeDataReader与.NET中的一样低级别。 – 2012-04-27 12:21:45

相关问题