从C#并行化SQL Server中的大量插入(以获得更好的时间性能)
问题陈述:如何在SQL Server中并行化插入(2008)
我正在为C#多线程工作者进行大规模的数值计算,基本上做一件事:在一段时间内(以天为单位)测试数千种可能的配置(矩阵组合)并将结果存储到SQL Server数据库中. 数据库设计非常简单: >组合套装 每个“组合集”都针对样本日进行测试,其每日结果在单个C#线程中处理,其中生成LINQ / SQL查询并在线程结束之前将其发送到DB.除组合集ID序列外,结果之间没有逻辑关系.这非常重要:这就是为什么我想要并行化插入内容,因为它基本上相当于结果块的批量转储 我欢迎任何建议,以使插入时间尽可能短. 编辑: 解决方法
如果您为每个插入使用单独的事务,那肯定会影响性能,因为DB服务器必须以原子方式执行每个插入.我从来没有使用过SQL服务器,但大多数SQL变种都有办法在一个事务中捆绑多个插入,通常有类似的东西
BEGIN TRANSACTION; ...<various SQL statements>... COMMIT TRANSACTION; 有关SQL Server语法,请参阅: http://msdn.microsoft.com/en-us/library/ms188929.aspx http://msdn.microsoft.com/en-us/library/ms190295.aspx 根据我的经验,这样的捆绑插件肯定有助于提高服务器性能,并在某种程度上有助于资源和网络的使用. 编辑: 大多数(所有?)不错的数据库服务器使用某种每行锁定,而不是每个表锁.您应该能够拥有多个并发事务,每个事务都有多个插入,没有问题 – 这就是数据库服务器的设计目标.您当然可以让每个工作线程执行自己的事务,从而并行化来自不同线程的插入. 由于您显然使用单台计算机进行计算和数据库,因此大量并行化数据库事务不会对性能造成太大影响,甚至可能使情况变得更糟,因为您实际上没有任何网络延迟来减少影响.只要所有CPU核心都忙,这可能意味着许多工作人员> = 12,您应该考虑其他优化. 如果您的线程在处理之后一次性生成它们的输出(例如,如果您计算一个大矩阵然后转储到数据库中)我怀疑您通过将结果存储到文件然后让DB将其读回到一个文件中而获得任何收益表. 另一方面,如果您的线程逐个进行输出,则可以将其输出的部分存储在内存中,然后将这些部分插入数据库,每轮执行多个事务.如果CPU未充分利用,在这种情况下增加工作线程数可能允??许您在DB存储数据时具有更好的CPU利用率. 将工作者输出存储在文件中应该避免恕我直言,因为它有效地使磁盘子系统上的负载增加了三倍.您可能想要这样做的唯一原因是,如果您确实没有用于中间存储结果的内存. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |