gpt4 book ai didi

c# - 从 C# 在 SQL Server 中并行化大量插入(以获得更好的时间性能)

转载 作者:太空狗 更新时间:2023-10-29 20:47:00 24 4
gpt4 key购买 nike

问题陈述:如何在 SQL Server (2008) 中并行化插入

我在 C# 多线程 worker 中为科学研究执行大量数值计算,这些 worker 基本上只做一件事:在一段时间内(以天为单位)测试数千种可能的配置(矩阵组合),并将结果存储到 SQL Server 数据库中。

如果我将结果一个一个地存储到数据库中(每个计算 session 约 300.000 行 * 100 个 session ),一个接一个,我最终要等待数小时才能结束存储过程。< br/>

数据库设计非常简单:

  • 组合集
    CS_ID1,值A1,值B1,值C1
    CS_ID2、值A2、值B2、值C2
    …………

  • 每天的结果
    CS_ID1,第 1 天,结果 1
    CS_ID1,第 2 天,结果 2
    CS_ID1,第 3 天,结果 3
    …………

    …………
    CS_ID2,第 1 天,结果 N
    CS_ID2,Day2,结果 N+1
    CS_ID2,第 3 天,结果 N+2

每个“组合集”都针对样本日进行测试,其每天的结果在单个 C# 线程中处理,其中生成 LINQ/SQL 查询并在线程结束前发送到数据库。除了组合集 ID 序列,结果之间没有逻辑关系。这非常重要:这就是为什么我想到将插入内容并行化,因为它基本上相当于结果 block 的批量转储

另一个可能很重要的细节是可以预先确定有多少行将被插入数据库(每个 block 和全部的)。这可能有助于组织表空间、通过页面拆分它们、预先修复 id 范围以便同时存储 block ,或类似的东西(不,我不是“高”或其他东西:-))

为了尽可能缩短插入时间,我欢迎任何类型的建议。

请考虑到我是一名 C# 开发人员,具有非常基本的 SQL Server 知识并且不太熟悉深层次的 DBA 技术概念(我看到锁定调整非常多,还有多线程和异步功能,但我不得不承认我一个人在森林里迷路了 :-) )

我有 12 个可用的 CPU 内核和 24Go RAM


编辑:决胜局
我欢迎任何关于监控整个过程时间的巧妙建议:从 C# 线程开始/结束到详细的 SQl 服务器插入报告(发生什么时间、方式和地点)。
我尝试使用 NLog 进行日志记录,但它极大地影响了处理时间,因此我正在寻找一些非常无缝且影响最小的智能解决方法。 SQL 服务器部分也是如此:我知道有几个日志和监视 SP 可用。我还没有弄清楚哪些适合我的情况。

最佳答案

300k 插入只是几秒钟的事情,最坏的情况是几分钟,而不是几小时。你一定做错了。 ETL SSIS world record回到 2008 年是 2.36 TB/小时,30 万条记录算不了什么

基本的经验法则是:

  • 批量提交。这是最重要的事情。不要 INSERT 一行,然后 INSERT 一行,然后 INSERT 一行令人作呕,每个插入 int 它自己的事务。你的程序必须等待日志(LDF)在他的案例中的每个语句之后刷新,并且会很慢。非常慢。而是启动一个事务,然后插入一批行,然后提交事务:

伪代码:

do
{
using (TransactionScope scope = new TransactionScope(
Required, new TransactionOptions() {IsolationLevel = ReadCommitted))
{
for (batchsize)
{
ExecuteNonQuery ("Insert ...")
}
scope.Complete ();
}
} while (!finished);

仅第一个选项就可以让您每秒插入 3000 次以上(300k 大约需要 2 分钟)。第二个选项应该让你进入每秒数万个范围。如果您需要更多,还有更高级的技巧:

  • 使用堆而不是 b 树(无聚集索引)
  • 禁用二级索引
  • 将客户端关联到软 NUMA 节点,并将每个客户端连接推送到锁定的表中,然后在最后使用分区切换将它们全部切换。这适用于真正高端,每秒数百万行。

我建议您从最基础的基础开始:批量提交。

关于c# - 从 C# 在 SQL Server 中并行化大量插入(以获得更好的时间性能),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4197284/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com