我正在看
激进索引:总锁定等待时间 > 5 分钟(行 + 页),平均等待时间较短
在我们的一张桌子上通过BlitzIndex发出警告,我不太明白会发生什么。有问题的索引与我们表上的主键有关:
ALTER TABLE [Authentication].[Tokens]
ADD CONSTRAINT [PK_Authentication.Tokens]
PRIMARY KEY CLUSTERED ( [TokenID] )
为了完整起见,这里是表结构的要点:
CREATE TABLE [Authentication].[Tokens](
[TokenID] [int] IDENTITY(1,1) NOT NULL,
... other columns here)
BlitzIndex 报告以下统计数据:Reads: 10,066,849 (2,259,000 seek 934,476 scan 6,873,373 lookup) Writes:1,399,277, 314 rows; 1.1MB
我有些困惑。我们不会查询/过滤掉这一列(如SELECT ... WHERE TokenID = 1
)。我唯一的猜测是该表可能被经常读取,并且使用默认的 SQL 锁定策略大量查询相互碰撞?
我愿意接受任何建议或反馈,对于一个看似简单和良性的表格。
请注意,您正在谈论的是 a
PRIMARY KEY CLUSTERED
(这意味着它是表本身),因此您不需要像WHERE TokenID = 1
命中该索引这样的查询。从您的场景中,大多数读取来自查找(您了解什么是查找读取方法吗?)这意味着大多数查询类似于SELECT TokenID, Column2, Column3 WHERE Column2 = 1
并且您有一个不包括 TokenID、Column2 和 Column3 的 Column2 索引。以下是我将如何解释你得到的输出:
读取:10,066,849(2,259,000 查找 934,476 扫描 6,873,373 查找)
2,259,000 次查找:这是一个相当大的值,但查找通常是访问索引的最佳方法,这里几乎没有改进的余地。
934,476 扫描:通常是最差的访问方法,但这个值与其他值相比可能不会对第一次修复产生最大的影响。
6,873,373 次查找:迄今为止最大的数字,值得关注,因为这可能是由于一些查询重复命中非聚集索引而导致的,这些索引可以改进为进行查找。
写入:1,399,277,314 行;
lookups
来调整成为),那么读取将不得不等待写入完成(反之亦然)将减少。seeks
有了这些信息,我将在查询表的查询中搜索
[Authentication].[Tokens]
正在执行查找读取的内容。一旦它们得到改进,我将sp_BlitzIndex
再次运行以测量调整的结果。进一步阅读:
Brent Ozar 解释了sp_BlitzIndex Aggressive Indexes以及如何修复 sp_BlitzIndex Aggressive Indexes 警告。
Pinal Dave 有一篇关于SQL SERVER – Removing Key Lookup的文章