2012-04-27 1 views
4

私はSQL Server CE 3.5データベースを持っています。私は次のコードを実行します:SQL Server CEのパフォーマンスは、テーブルから選択すると7000レコードで8秒かかります

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"); 

これは長いですか、それとも高速に読み込むべきですか?

この選択を高速化するにはどうすればよいですか?

私が使用している場合、他のテーブルと結合、時間が飛躍的に成長していく...

編集:私は次の新しいバージョンのコードを変更するが、それでも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

+0

これは、テーブルa – John

+0

@ aから編集a.column1、a.column2を編集することです。また、SQL CEを使用してからディスクIOのような他の制限要因があることを理解する必要があります。任意の種類の最適化またはロード・バランシングによってSQLトランザクションを処理するサーバーを持つことができます。 –

答えて

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; 
     } 
    } 
} 

もちろん、適切なエラー処理を追加して、好きなようにクリーンアップしてください。また、DbDataAdapterの実装と比較してパフォーマンスがまともであるEntity Frameworkもあります。

SqlCeを使用しているため、ディスクIOのような他の制限要因があります。また、SQLトランザクションを処理するサーバーに任意の種類の最適化を適用する必要はありません。

+0

答えをありがとう。私はあなたのバージョンのコードを変更しましたが、まだ私は7.5秒を取得...私は私の投稿を編集した、あなたは私がそれを変更した方法を見ることができた.. – John

+0

それはあなたに制限されているあなたのディスクIOかもしれません。私のマシンでは、約2秒で7000レコードを処理することができました。 SqlCeDataReaderを使用することは、.NETで取得する場合と同じくらい低レベルです。 –

関連する問題