SqlCE通过insert into和【SqlCeResultSet+SqlCeUpdatableRecord】两种方式插入完全相同的数据,为什么后者sdf数据文件要大很多?

一个数据表,两列int,通过两种方式插入完全相同的50万行数据:

方式一:insert into

SqlCeCommand _Command=new SqlCeComman();
_Command.Connection=Connection;//我的数据库连接
for(int i=0;i<500000;i++)
{
string SQL=“insert into xx(id,content) values(”+i+","+i+")"; //xx是表名
_Command.CommandText=SQL;
_Command.ExecuteNonQuery();
}

方式二:SqlCeResultSet+SqlCeUpdatableRecord

string _SQL_Text = “select * from xx”;
SqlCeCommand _Command = new SqlCeCommand(_SQL_Text, Connection);
SqlCeResultSet _ResultSet= _Command.ExecuteResultSet(ResultSetOptions.Updatable | ResultSetOptions.Scrollable);
SqlCeUpdatableRecord _Record= _ResultSet.CreateRecord();


for (int i = 0; i < 500000; i++)
  {
        _Record.SetInt32(0, i);
        _Record.SetInt32(1, i);
        _ResultSet.Insert(_Record);
   }
  1. 结果发现方式一的sdf文件大小10.3M,方式二14.5M,我看了里面内容,的确一模一样,都是50万行。为啥呢?
  2. 行数少的时候方式二插入更快,但行数越多就越慢,方式一插入速度与数据量关系不大,为啥呢。

问题已解决,出在ResultSetOptions.Scrollable上,如果仅仅是插入数据,没必要加这个,它随着数据量增大会使速度急剧下降,最后还不如普通insert into,而且占用储存空间,不知道具体原因,可能原因参考第一条回答。多谢大家!

下面的方法相当于先插入默认数据,再修改。
而sqlce的修改,采用的是删除+重新插入 的方法,所以会产生存储碎片