SQL Server 2012 - 位列上的频繁 SELECT 和 UPDATE。索引没有帮助

Dai*_*Dai 3 performance index sql-server sql-server-2012

我有一个包含大约 200 万行的 SQL Server 表,该表存储简短的文本文档。这是我的架构:

CREATE TABLE Documents (
    documentId bigint IDENTITY NOT NULL,
    content nvarchar(MAX) NOT NULL,
    isIndexed bit NOT NULL
)
Run Code Online (Sandbox Code Playgroud)

我有一个单独的基于 Lucene 的索引器进程来执行此操作:

SELECT TOP 1 documentId, content FROM Documents WHERE isIndexed = 0
Run Code Online (Sandbox Code Playgroud)

然后在执行此操作之前执行索引操作:

UPDATE Documents SET isIndexed = 1 WHERE documentId = @documentId
Run Code Online (Sandbox Code Playgroud)

最初这工作正常。当表中的每个文档都没有被索引时(即所有isIndexed值都是 0),那么每次检索大约需要 5 毫秒。

然而,随着越来越多的文档被索引,检索时间慢慢增加。目前大约是 150 毫秒 - 速度降低了 30 倍。我注意到 UPDATE 语句似乎总是在 2 毫秒内运行,所以我知道这不是问题。

从一开始,表在 isIndexed 列上一直有一个非聚集索引,但实际执行计划显示 SQL Server 使用索引扫描(而不是搜索)。

我可以做些什么来加速系统?

我知道现有的“isIndexed”列本身很糟糕,但由于索引器的工作方式,它无法直接通过 documentId 请求文档。由于这个原因和其他原因,我不能接受任何不能解决手头直接问题的答案。

Aar*_*and 5

由于选择性,位列上的索引根本没有帮助。您应该考虑过滤索引:

CREATE INDEX unindexed ON dbo.Documents(documentId) WHERE IsIndexed = 0;
Run Code Online (Sandbox Code Playgroud)

您还应该ORDER BY documentId在您的SELECT.

尽管您应该在登台环境中对此进行测试,因为它可能对您有所帮助,SELECT但可能会用更昂贵的UPDATE.