为什么简单更新的时间不与记录数成线性关系?

oll*_*lle 2 performance sql-server

我正在运行一些性能测试,我从 900.000 条记录的数据集开始,更新需要 10 秒或每秒大约 90000 条记录。然后我将记录数增加到 9.000.000,更新耗时 170 秒或每秒更新约 52941 条记录。

为什么当记录总数增加时每秒更新的记录数会下降?

数据中的分布是一样的,较大的集合是复制10次的较小的集合。自从我复制了 10 次数据以来,数据和日志文件的大小确实增加了。在那之后我确实缩小了日志文件。此时数据库服务器上没有其他工作负载。

执行更新的存储过程如下:

CREATE PROCEDURE updatePoints      
    @ids NVARCHAR(MAX)    
AS 
    DECLARE @points1 INT
    DECLARE @points2 INT

    SET @points1 = 1
    SET @points2 = 2

    UPDATE p
    SET points = (0 + CASE WHEN p.[x] = m.[x] AND p.[y] = m.[y]
                              THEN @points1
                              ELSE 0
                      END + 
                      CASE WHEN p.[u] = m.[u] AND p.[v] = m.[v]
                              THEN @points2
                              ELSE 0
                      END)
    FROM p 
    JOIN  m ON m.id = p.mid
    JOIN platform.Split(@ids) i ON i.Value = m.id
    WHERE m.[status] = 1 
Run Code Online (Sandbox Code Playgroud)

Mar*_*ith 5

如果您发布执行计划,可能会有我们可以强调的明显差异。除了计划之外,它可能是:

  • 数据集中值的不同分布,导致更频繁的页面拆分
  • 数据和/或日志文件增长
  • 溢出到 tempdb 的排序或散列操作
  • 与其他工作负载的争用

需要更多信息(查询、示例数据、模式、计划)以获得更好的答案。