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 请求文档。由于这个原因和其他原因,我不能接受任何不能解决手头直接问题的答案。
由于选择性,位列上的索引根本没有帮助。您应该考虑过滤索引:
CREATE INDEX unindexed ON dbo.Documents(documentId) WHERE IsIndexed = 0;
Run Code Online (Sandbox Code Playgroud)
您还应该ORDER BY documentId
在您的SELECT
.
尽管您应该在登台环境中对此进行测试,因为它可能对您有所帮助,SELECT
但可能会用更昂贵的UPDATE
.
归档时间: |
|
查看次数: |
1471 次 |
最近记录: |