我们有一个看起来像这样的工作表
CREATE TABLE [dbo].[Clearing](
[Skey] [decimal](19, 0) IDENTITY(1,1) NOT NULL,
[BsAcctId] [int] NULL,
[Status] [varchar](20) NULL,
CONSTRAINT [csPk_Clearing] PRIMARY KEY CLUSTERED ( [Skey] ASC )
)
Run Code Online (Sandbox Code Playgroud)
像这样的覆盖索引
CREATE NONCLUSTERED INDEX [IX_Status] ON [dbo].[Clearing]
(
[Status] ASC
)
INCLUDE ( [Skey], [BsAcctId])
Run Code Online (Sandbox Code Playgroud)
我们使用这个查询来选择下一个工作
select top (1) Skey, BsAcctId, Status from Clearing with ( readpast, updlock )
where (Clearing.Status = 'NEW')
order by Clearing.Skey
Run Code Online (Sandbox Code Playgroud)
(真实表大约有 10 列。它们都在索引 include() 子句和选择列列表中。)
执行计划非常简单。它使用 IX_Status 进行索引查找,然后使用顶级运算符。由于索引按 (status, skey) 排序,因此计划不需要排序。
该表位于 AlwaysOn 可用性组中的数据库中。该组有 2 个数据库服务器。(这是一个测试系统。)
通常这个表和查询工作得很好。所以我们去应用 Windows …