SQL Server CE性能,从表中选择7000条记录需要8s
Posted
技术标签:
【中文标题】SQL Server CE性能,从表中选择7000条记录需要8s【英文标题】:SQL Server CE performance, select from a table takes 8s for 7000 records 【发布时间】:2012-04-27 10:59:27 【问题描述】:我有 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;
【问题讨论】:
就是:从表a中选择a.column1,a.column2 @您的编辑,您还必须了解,自从您使用 SQL CE 以来,您还有其他限制因素,例如磁盘 IO,并且您没有服务器处理任何类型的优化或负载平衡的 SQL 事务. 【参考方案1】: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 事务的服务器。
【讨论】:
感谢您的回答。我已经更改了您版本的代码,但我仍然得到 7.5 秒...我已经编辑了我的帖子,您可以看到我是如何更改它的.. 可能是您的磁盘 IO 限制了您。在我的机器上,我能够在大约 2 秒内处理 7000 条记录。使用 SqlCeDataReader 与在 .NET 中一样低级。【参考方案2】:这个问题很老了,但我想为今天可能找到它的谷歌用户提供一个快速的解决方案:
我可以用它在大约 800 毫秒内查询 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));
当然,您必须根据需要调整代码,所以 f.e.如果您想获取字符串,则需要更改 reader.Get 命令,列表等。
【讨论】:
以上是关于SQL Server CE性能,从表中选择7000条记录需要8s的主要内容,如果未能解决你的问题,请参考以下文章