我最近问了一个关于必须按 GUID 顺序记录事件的表的最佳索引策略的问题。GUID 令人讨厌,但它是不可避免的,因为它是其他地方的 FK。
就我想做的查询而言,它们本质上是以下形式SELECT TOP N SomeColumn FROM t WHERE GuidColumn = 'someguid' ORDER BY AutoIncInt DESC
我做了一些实验,一个很好的权衡方法似乎是:
- 在表上创建
AutoIncInt
列作为唯一的集群键 - 在 上创建一个非唯一的非聚集索引
GuidColumn
,并且INCLUDE SomeColumn
起初我有非聚集索引SomeGuid ASC, AutoIncInt DESC
,认为这将有助于ORDER BY AutoIncInt DESC
查询的一部分,但当我删除它时计划保持不变 - 不需要排序操作,查询只是命中 NC 索引,做了一个顶部和一个选择;似乎 SQLServer 在某种程度上足够聪明,即使在非聚集索引中根本没有引用 AutoIncInt 时,也有一种方法可以轻松按顺序获取数据/轻松计算 TOP 需要哪些最后 N 行
这种机制在实践中如何运作?由于引用了聚簇索引,非聚簇索引是否具有隐式顺序,以便 SQLS 可以快速轻松地推断出我想要 SomeColumn 来自哪些 N 个索引节点?