【问题标题】:Fatest way to insert data in Sql Server CE在 Sql Server CE 中插入数据的最快方法
【发布时间】:2015-12-28 08:46:14
【问题描述】:

我一直在为我的产品开发C# Compact Framework 4.0

我有一台服务器和一部手机,我必须将服务器上的所有数据同步到我的移动设备。

通常大约 6000 个条目将被插入到我的移动设备中的一张桌子上。

现在我直接使用带有指定表的索引名称的表。

6000 个条目大约需要 55 秒。

有没有更快的插入方式?

SqlCeCommand cmdItem = conn.CreateCommand();
SqlCeResultSet rsItem;
cmdItem.CommandText = "item_info";
cmdItem.IndexName = "PK_item_info";
cmdItem.CommandType = CommandType.TableDirect;
rsItem = cmdItem.ExecuteResultSet(ResultSetOptions.Updatable | ResultSetOptions.Scrollable);
while(reader.read()){

    SqlCeUpdatableRecord recItem = rsItem.CreateRecord();
    recItem.SetString(1, cmdItem.SerialNo);
    recItem.SetInt32(10, 0);
    rsItem.Insert(recItem);  

}

【问题讨论】:

  • 如果您共享当前代码可能会更好
  • 好吧,如果不看代码就很难说,但是在向 SQL 命令添加参数时保持连接打开和明确指定数据类型是影响速度的两件事。否则,它就是移动设备和移动 SQL Server。不要指望奇迹会在速度方面发生。

标签: c# sql-server-ce compact-framework sqlcedatareader


【解决方案1】:

删除“|ResultSetOptions.Scrollable”

然后移动线:

SqlCeUpdatableRecord recItem = rsItem.CreateRecord();

在while循环之上。

var cmdItem = conn.CreateCommand();
cmdItem.CommandText = "item_info";
cmdItem.CommandType = CommandType.TableDirect;
var rsItem = cmdItem.ExecuteResultSet(ResultSetOptions.Updatable);
var recItem = rsItem.CreateRecord();
while(reader.read())
{        
    recItem.SetString(1, cmdItem.SerialNo);
    recItem.SetInt32(10, 0);
    rsItem.Insert(recItem);
}

【讨论】:

  • indexName 呢?使用索引名称会提高性能吗??
  • 不,根本没有使用(使用Seek和SetRange时使用索引名称)
  • 我的速度大约为每秒 109 行。在我得到大约每秒 95 行之前。还有其他方法吗??如果我每秒大约获得 130 行,我会很棒。
  • 所以现在更快了?确保所有数据类型的大小尽可能小,您可以尝试删除和重新创建索引。考虑使用更快的磁盘(也许是更快的 SD 卡?)
  • 索引过多会减慢插入过程。也许有些索引是你不需要的或者你可以优化的?
【解决方案2】:

使用此库,您可以将SqlBulkCopy (SQLBulkCopy Class (Microsoft website)) 与您的 SQL Server CE 数据库一起使用。

Library which supports SQL Server CE

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-21
    • 1970-01-01
    • 2014-09-12
    • 2016-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多