首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL Server 2019在只有1-2个MAXDOP 8至14内核上运行100%

问SQL Server 2019在只有1-2个MAXDOP 8至14内核上运行100%
EN

Database Administration用户
提问于 2021-02-12 06:58:11
回答 1查看 444关注 0票数 2

这是这个问题的背景。

我正在使用ADO从C++程序中将100多万条记录插入到表中。每次从平面文件中读取一行,并将信息转换为ADO将接受的格式,以便向Server添加/更新。

现在,在您问之前,这是一个遗留应用程序,并且不会根据客户端请求将其转换为.NET。

我有一个i7-5960x CPU运行/超过4.4GHZ与32 an的内存,没有旋转磁盘,所有三星SSD。

我有SqlServer2019(),其MAXDOP为8,在具有8个核心和8个逻辑核的系统上。

当运行Add/Update进程时,我的CPU总使用量为10%-20%,其中1-2个内核的运行速度为100% (内存使用量为32G中的10G ),导致添加/更新进程大大减慢了处理速度。Server显示132个线程,使用占CPU总使用量的75-80% .即使我将MAXDOP提高到14,也不能阻止Server使用任何CPU核心的100%。

如果我注释掉将数据写入Server的函数,应用程序将从一个平面文件(37个字段,387个字符总数)处理数据到添加/更新Server数据所需的格式,该函数将每秒处理至少10,000条记录。当我运行写入SQL Server的进程时,它将开始每秒处理/写入大约600条记录到SQL Server,然后在大约100,000条记录之后,缓慢地下降到每秒约220条记录。

因此,问题是,我是否可以将SQL Server限制在每个核心(而不是全部CPU使用)基础上的最大使用量,或者强制它将线程/处理分散到所有MAXDOP核上。当它完成最大的一个核心,它将做它大约5分钟,然后切换到另一个核心,并最大它在100%,而以前的核心将下降到几乎什么都没有。

感谢阅读到目前为止,如果您能提供任何帮助,它将是真正的感谢。

EN

回答 1

Database Administration用户

发布于 2021-02-12 16:44:54

每次从平面文件中读取一行,并将信息转换为ADO将接受的格式,以便向Server添加/更新。

使用这种方法将很难利用多个Server核心。每个单行插入将由一个核心依次执行。而且每个插入都很可能继续使用相同的核心,因为每个插入都来自相同的连接。来自2012内部部件,Kalen等人:

每个SPID都有一个首选调度程序,它是最近处理来自SPID的请求的调度程序。

如果不是很麻烦,那么您可以通过将文件拆分成多个文件,然后让C++应用程序的多个实例同时加载每个文件,从而在吞吐量上得到“快速获胜”的改进。当然,您可能会遇到其他瓶颈,但值得一试。

附带说明:丹·古兹曼提到:

缓慢下降的性能是添加/更新查询正在执行扫描的症状。索引/查询调优可以避免这种情况,并提供更多的线性和更好的整体性能。

如果您的表有其他索引或外键/唯一约束,则Server在加载表时必须检查越来越多的数据。您可以优化这些检查,或者先用应用程序加载一个未索引的堆暂存表,然后再使用that将数据移动到真正的表。

总的来说,为了利用更多的内核,您需要改进加载应用程序的并发性。要么使用批量加载API,要么同时从多个客户端插入。为了获得更稳定的吞吐量,您需要避免昂贵的表扫描,可能是插入一个暂存表,而不是直接插入应用程序表。

票数 2
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/285272

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档