使用.NET将单个记录写入MS SQL 2008 Server的最有效方法是什么?

时间:2012-10-22 14:03:40

标签: sql sql-server sql-server-2008 optimization

我正在编写一个命令行工具(在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();

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

尽可能在您插入的桌子上消除这些:

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

同时确保使用此表没有索引视图。