所以我在早上阅读博客时偶然发现了这个有趣的练习:
https://www.erikdarlingdata.com/sql-server/lets-design-an-index-together-part-3/
这是文章中的问题和他提出的索引。
SELECT TOP (5000)
p.LastActivityDate,
p.PostTypeId,
p.Score,
p.ViewCount
FROM dbo.Posts AS p
WHERE p.PostTypeId = 1
AND p.LastActivityDate >= '20110101'
ORDER BY p.Score DESC;
CREATE INDEX whatever
ON dbo.Posts(PostTypeId, Score DESC, LastActivityDate)
INCLUDE(ViewCount) WITH (DROP_EXISTING = ON);
非常有趣的构建和索引,并尝试相应地调整它。但是,我之前可能误解了索引键顺序很重要,并且当索引键顺序与查询不匹配时,某些 WHERE 子句可能不使用某些索引。意思是,我对列出的特定场景缺乏经验,我假设这个查询不会使用这个索引,因为 Score 位于索引键定义的中间,但不在查询的 where 子句中。
当优化器决定使用什么索引并且只要 WHERE 子句列和 ORDER by 列在索引定义中时,是否会评估 ORDER BY 列,然后它会使用它?
我想我的问题更多是关于优化器如何评估关于 WHERE 子句和 ORDER BY 子句的索引。