执行计划中无法解释的排序操作

Apr*_*llo 3 sql-server

我正在一个有 750 万条记录的数据库上运行以下查询:

UPDATE TestTable
SET TestCol='1234', TestCol2='1234', TestCol3='1234', Anonymised=1
WHERE [Date] >= '25 June 2016' 
AND [Date] <= '25 August 2016'
Run Code Online (Sandbox Code Playgroud)

出于某种原因,执行计划包括对主键的排序操作。

在此处输入图片说明 在此处输入图片说明

鉴于该列上已经有聚集索引,我不希望它必须对主键进行排序。

任何人都可以解释为什么会发生这种情况以及我可以做些什么来避免排序操作?

编辑:

表创建脚本

CREATE TABLE [dbo].[TestTable](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [TestCol] [nvarchar](50) NOT NULL,
    [TestCol2] [nvarchar](50) NOT NULL,
    [TestCol3] [nvarchar](50) NOT NULL,
    [Anonymised] [tinyint] NOT NULL,
    [Date] [datetime] NOT NULL,
 CONSTRAINT [PK_TestTable] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, 
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)

Eri*_*ing 10

您的计划正在使用一个非聚集索引,大概是Date首先找到适合您的WHERE子句的值。

为了优化聚集索引更新的 IO 访问,对来自该索引访问操作的数据进行排序以匹配 PK/CX 的键顺序。

顺便说一句,您不应该一次更新那么多行