小编Jur*_*obl的帖子

内存优化间歇性非常慢的性能

我有一个内存优化表(在我的测试中)有 1000 万行。UPDATE针对它并行运行一些,我得到 CPU 的间歇性峰值和查询的执行时间的巨大峰值(从 1 毫秒开始> 1 秒)。CPU 峰值是由 SQLServer 引起的。在这些高峰期间,所有查询都很慢,即使是不使用相同表或GETUTCDATE.

它在 SQL Server 2019 CU10、8 核和 100GB RAM 上运行。我还让它在裸机服务器(24 核)、新的 VM 和我的笔记本电脑上运行,结果或多或少相同。该表在我的测试系统中有 1000 万行,在 prod 中有 40 mio。有四个NONCLUSTEREDindizes 和两个NONCLUSTERED HASH,它们没有长链并且有很多未装满的桶。

Prod 使用许多 InMemory 表、外键和本机编译的过程,所以我在减少问题的同时保持完全相同的特征时遇到了一些问题。在我重现该问题时,我在 C# 中并行运行 10 个线程,每次更新之间等待 1-5 毫秒:

UPDATE ContainerAutoTest SET LastComment = 'TestEntry' WHERE Name = @TestContainer
Run Code Online (Sandbox Code Playgroud)

每个线程都有自己的要更新的行,因此行级别不应该有任何冲突。我是从同一台机器还是通过网络运行查询都没有关系。

在 prod 中,我们在写入数据时大约每 30 秒就会出现一次尖峰,在我的测试中,我可以在大约 20 秒甚至每 2 秒处重现尖峰,具体取决于机器、我正在运行的线程数量以及更新之间的等待时间。

Prod 中的 CPU 峰值Cpu尖峰再现

我已经重建了一个全新的表,我可以在其中重现问题:

CREATE TABLE [dbo].[ContainerAutoTest]
(
    [Id] [int] IDENTITY(1,1) NOT NULL, …
Run Code Online (Sandbox Code Playgroud)

performance sql-server memory-optimized-tables sql-server-2019

5
推荐指数
1
解决办法
95
查看次数