4

SQL Server CE 3.5 データベースがあります。次のコードを実行します。

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

2 に答える 2

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

そしてもちろん、適切なエラー処理を追加し、好みに合わせてクリーンアップします。実装と比較してパフォーマンスに優れたEntityFrameworkありDbDataAdapterます。

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

于 2012-04-27T11:11:00.390 に答える