![]() |
1
5
如果为每个插入使用单独的事务,这肯定会影响性能,因为DB服务器必须原子地执行每个插入。我从未使用过SQL server,但是大多数SQL变体都有一种方法可以在一个事务中组合多个插入,通常是
有关SQL server语法,请参见: http://msdn.microsoft.com/en-us/library/ms188929.aspx http://msdn.microsoft.com/en-us/library/ms190295.aspx 以我的经验,像这样捆绑插入肯定有助于提高服务器性能,在某种程度上,也有助于资源和网络的使用。 编辑: 大部分(全部?)像样的数据库服务器使用某种每行锁,而不是每表锁。您应该能够有多个并发事务,每个事务都有多个插入,没有问题——这就是DB服务器的设计目的。您当然可以让每个工作线程执行自己的事务,从而并行化来自不同线程的插入。 由于您显然是使用一台计算机进行计算和数据库,因此广泛并行化数据库事务不会对性能产生太大影响,甚至可能会使其更糟,因为您实际上没有任何网络延迟来减少的影响。只要所有的CPU内核都很忙(这可能意味着有许多工作线程>=12),就应该考虑其他优化。 如果您的线程一次性生成它们的输出 之后 处理(例如,如果计算一个大矩阵 然后 转储到数据库中)我怀疑通过将结果存储到文件中,然后让数据库将其读回表中,您会得到什么。 另一方面,如果您的线程一个接一个地执行其输出,您可能会受益于将其输出的一部分存储在内存中,然后将这些部分插入到数据库中,每轮执行多个事务。在这种情况下,增加工作线程的数量可以让您在数据库存储数据时有更好的CPU利用率, 如果 CPU未充分利用。 应该避免将工作机输出存储在文件中,因为它有效地将磁盘子系统上的负载增加了三倍。您可能想要这样做的唯一原因是,如果您真的没有内存来中间存储结果。 |
![]() |
2
9
300k插入数是几秒钟的事,最坏的是几分钟,而不是几小时。你一定做错了。这个 ETL SSIS world record 2008年是每小时2.36 TB,有30万的记录 没有什么 . 基本经验法则是:
伪码:
仅第一个选项就可以使您每秒插入3000个以上(300k大约2分钟)。第二个选项会让你进入每秒数万次的射程。如果你需要更多,这里有更高级的技巧:
我建议您从基础知识开始:批量提交。 |
![]() |
3
5
这个
|
![]() |
4
2
下面是一篇关于使用C#进行批量插入的文章: http://blogs.msdn.com/b/nikhilsi/archive/2008/06/11/bulk-insert-into-sql-from-c-app.aspx 关于使用C#进行大容量插入的其他想法是堆栈溢出问题: Whatâs the best way to bulk database inserts from c#? 希望这有帮助。 |
![]() |
5
1
你可以尝试使用 Parallel For 要插入。。。 ... 但我会先尝试批量插入或批量提交。。。 |
![]() |
6
1
这是个有趣的问题。首先,如何使用数据库中的值?它们是否参与后续计算,或者数据库只是“转储”以存储结果以供以后处理?您的应用程序/进程是否每天24小时运行?
|
![]() |
7
1
|
|
Ma Joonyoung · 粗粒度和细粒度链表的时间比较 1 年前 |
![]() |
user1700890 · 了解交互式代理Python API中的线程 2 年前 |
![]() |
AntonBoarf · 为什么要将实例变量指定给局部变量? 2 年前 |
![]() |
rhymes · 如何让线程操作相同的java列表 2 年前 |