我有一个项目,涉及将设备中的数据直接记录到 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/