sql-server - 如何对 SQL Server 2008 进行快速插入

标签 sql-server performance

我有一个项目,涉及将设备中的数据直接记录到 SQL 表中。

在写入sql server(顺便说一下,2008 Express)之前,我在代码中做了很少的处理

通常我使用 sqlhelper 类的 ExecuteNonQuery 方法并传入 SP 期望的存储过程名称和参数列表。

这非常方便,但我需要一种更快的方法。

谢谢。

最佳答案

使用 INSERT 语句甚至存储过程执行 ExecuteNonQuery 将使您在 Express 上每秒插入数千次。 4000-5000/秒很容易实现,我知道这一点。

通常会减慢单个更新速度的是日志刷新的等待时间,您需要考虑到这一点。最简单的解决方案是简单地批量提交。例如。每 1000 次插入或每秒提交一次。这将填满日志页,并分摊事务中所有插入的日志刷新等待成本。

通过批量提交,您可能会成为磁盘日志写入性能的瓶颈,除了更改硬件(在日志上进行 raid 0 strip )之外,您无能为力。

如果您遇到了较早的瓶颈(不太可能),那么您可以查看批处理语句,即。发送一个包含多个插入的 T-SQL 批处理。但这很少有返回。

当然,您需要将写入的大小减少到最小,这意味着将表的宽度减少到所需的最小列,消除非聚集索引,消除不需要的约束。如果可能,请使用堆而不是聚集索引,因为堆插入比聚集索引快得多。

几乎不需要使用快速插入接口(interface)(即SqlBulkCopy)。在批量提交上使用普通的 INSERTS 和 ExecuteNoQuery 会比部署批量插入更快地耗尽驱动器顺序写入吞吐量。在快速 SAN 连接的机器上需要批量插入,并且您提到了 Express,所以情况可能并非如此。人们有一种相反的看法,但这只是因为人们没有意识到批量插入为他们提供了批量提交,而加速思考的是批量提交,而不是批量插入。

与任何性能测试一样,请确保消除随机性,并预分配数据库和日志,您不希望在测试测量或生产过程中遇到数据库或日志增长事件,因为太业余了。

关于sql-server - 如何对 SQL Server 2008 进行快速插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2861944/

相关文章:

c# - 从高斯分布中抽取随机值的最快方法是什么?

performance - DNS 预取和页面优化

sql-server - 如何在 SQL Server 中将 varchar 'DDMMYYYY HH:MM:SS' 转换为 DATETIME

sql-server - 从 SQL Server 链接服务器调用 Oracle 函数

sql-server - 帮助选择要选择的 SQL Server 2008 横向扩展解决方案(复制,...)

c# - 是否应该避免使用 LINQ,因为它很慢?

java - 为什么在循环中进行计算会减慢将打印写入控制台但不会减慢写入文件的速度?

python - 将一些数据库数据(SQL 表)转换为 .csv 格式

c# - 删除行,重新播种非 PK 索引列? C#

c - 使用C替换具有更高性能的最佳方法是什么?