0

我正在编写一个命令行工具(在 Windows 7 机器上运行),它将单个记录插入到表中,然后退出。我正在使用 C# (.NET 4.5) 和 SQL Server 2008。

数据记录包含一个大(最多 6000 字节)字符串、一个时间戳和一个自增整数 ID 主键。该表没有附加外键。

此外,由于这是该数据库最常见的使用场景,我想对其进行优化。我如何设置数据库有什么技巧可以帮助减少单个插入时间吗?

[编辑] 我目前正在使用的代码......

SqlConnection con = new SqlConnection(ConnectionString);
con.Open();
SqlTransaction trans = con.BeginTransaction();

SqlCommand cmd = new SqlCommand("INSERT INTO [msglog](message,project,username,computername,updated_at) VALUES (@m,@p,@u,@c,@i,@t)", con, trans);
cmd.Parameters.AddWithValue("@u", Username);
cmd.Parameters.AddWithValue("@c", Computername);
cmd.Parameters.AddWithValue("@m", msg);
cmd.Parameters.AddWithValue("@p", ProjectName);
cmd.Parameters.AddWithValue("@t", DateTime.Now);
cmd.ExecuteNonQuery();
trans.Commit();
4

3 回答 3

2

在您的代码示例中,我怀疑大部分时间都花在建立与 SQL Server 的连接上。我会推荐:

  • 尝试重用连接/应用程序的单个实例。您的问题表明应用程序打开,插入一条记录,然后退出。这需要不断地为单个语句重新建立新连接,更不用说启动应用程序本身的开销了。
  • 删除您的交易(单个语句不需要)。
  • 不要费心尝试为您的语句构建单个字符串。您应该使用参数,并且使用参数可能会更快。SQL Server 更有可能缓存相同查询的执行计划(参数值不断变化)。
  • 快速插入表格(RedFilter 在这里有一些很好的建议)。我要补充一点,理想情况下,您会通过递增键对表进行聚类,以便插入始终位于表的一端。

可能还有其他微优化,但真正解决我上面的第一个问题会给你带来最显着的加速。

于 2012-10-22T14:38:49.700 回答
2

我的建议是创建一个连接到数据库的 Windows 服务。您的应用程序将向服务发送消息,该服务反过来将异步发送数据库更新。其他答案显示了 SQL 方面提高性能的好方法。

于 2012-10-22T15:41:36.877 回答
1

尽可能在要插入的表格中消除这些:

  • 常规索引
  • 全文索引
  • 触发器
  • 持久化计算列

还要确保没有使用此表的索引视图。

于 2012-10-22T14:07:40.217 回答