sql-server – 如何快速插入SQL Server 2008

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

在写入sql server之前,我在代码中进行的处理非常少(2008年顺便说一下)

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

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

谢谢。

解决方法

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

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

使用批量提交,您可能会遇到磁盘日志写入性能的瓶颈,除了更改硬件(在日志上进行raid 0条带化)之外,没有什么可以做的。

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

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

几乎不需要使用快速插入接口(即sqlBulkcopy)。在批量提交中使用普通的INSERTS和ExecuteNoQuery,您将比部署批量插入的速度快得多地耗尽驱动器顺序写入吞吐量。快速SAN连接的机器上需要批量插入,你提到Express,所以可能不是这样。在那里有一种相反的看法,但仅仅是因为人们没有意识到批量插入给了批量提交,并且它的批量提交速度提高了,而不是批量插入。

与任何性能测试一样,请确保消除随机性,并预先分配数据库和日志,您不希望在测试测量期间或生产期间点击数据库或日志增长事件,这是非常业余的。

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 'EastRiver' 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...