0

我有一个长时间运行的存储过程,其中包含很多语句。经过分析确定了花费最多时间的几个语句。这些语句都是更新语句。

查看执行计划,查询在几秒钟内并行扫描源表,然后将其传递给收集流操作,然后传递给

在此处输入图像描述

这有点类似于下面,我们看到索引创建语句的相同行为也会导致缓慢。

https://brentozar.com/archive/2019/01/why-do-some-indexes-create-faster-than-others/

表有 6000 万条记录,在我们进行大量数据加载、更新和删除时是一个堆。

读取源代码不是问题,因为它在几秒钟内完成,但连续发生的实际更新需要大部分时间。

4

2 回答 2

0

您多久更新一次此堆中的行?因为,与聚集索引不同,堆将使用 RID 来查找特定行。但问题是(除非您专门重建它)当您更新一行时,最后一行仍将保留在原来的位置,现在指向新位置,从而增加每次执行时所需的查找次数连续更新。我真的不认为这会在这里受到影响,但是如果您在表上添加聚集索引并查看更新时间如何受到影响,您能否看到会发生什么?

另外,我不认为你在桌面上有一些沉重的触发器,也做了很多事情,对吧?

此外,由于您指的是 Brent Ozar 的文章,他确实主张将更新分成一次不超过 4000 行的批次,因为这已被证明是最快的,并且将低于 5000 行 X-lock这将在更新期间发生。

于 2021-05-11T07:28:52.933 回答
0

一些尝试的建议:

如果您在目标表上有索引,则在之前删除它们并在之后重新创建应该可以提高插入性能。

向要插入的表添加insert into [Table] with (tablock)提示,这将使 sql server 能够以独占方式锁定表,并允许插入也并行运行。

或者,如果这没有产生改进,请尝试向maxdop 1查询添加提示。

于 2021-04-24T10:44:54.483 回答