SQL Server CE 性能,从表中选择需要 8s 的 7000 条记录

本文关键字:8s 7000 记录 选择 CE Server 性能 SQL | 更新日期: 2023-09-27 18:32:22

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

SQL Server CE 性能,从表中选择需要 8s 的 7000 条记录

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实现相比,它在性能上不错。

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

这个问题很老,但我想为今天可能找到它的谷歌员工提供一个快速的解决方案:

我可以用它在~800ms内查询129000个值。

var query = "SELECT timestamp FROM " + tablename;
                    SqlCeCommand cmdGetOldMasterId = new SqlCeCommand(query, _con);
                    SqlCeDataReader reader = cmdGetOldMasterId.ExecuteReader();
                    var queried_data = new List<int>();
                    while(reader.Read())
                    {
                        queried_data.Add(reader.GetInt32(0));
                    }

当然,您必须根据自己的需要调整代码,因此,如果您想抓取字符串,则需要更改读取器。获取命令,列表等。