组合键的顺序以获得最佳查找性能

kev*_*vin 3 sql-server

我有一个由两个字段组成的复合键的表:AB

A就像用户 ID 或机器 ID,它是全局唯一的。B只有几个可能的值(小于 5)。组合键的样子(user1 + B1)(user2 + B1)(user3 + B1)(user1 + B2)等我不希望通过向数据转换成几桌分裂B以来的行数还没有达到那个量呢。

为了获得最佳查找性能,主索引中字段的顺序应该是什么?AB或者BA

Mar*_*ith 5

对于在两列上进行相等查找的查询,这无关紧要。您需要查看其他查询,以了解它们如何从这两种可能性中受益。

例如,(A,B) 上的索引也可以用于 A 上的相等搜索,但不能用于 B 上的相等搜索。

此外,如果您在查询中使用 ORDER BY A,B,那么 A,B 上的索引可以避免排序。

你说你没有这样的查询,并且使用两列都是严格相等的。

作为决胜局,您可能会考虑哪个前导列将成为最有用的直方图,但是对于您描述的查询模式,除了一起查找唯一索引中的键之外,A 或 B 都不会被查询,两者都没有用。

所以在你的情况下没关系。


顺便说一句:人们一直认为需要将最具选择性的列放在首位。

这在这里没有任何区别。无论哪种方式,SQL Server 都可以在两列上查找。与评论中链接的 StackOverflow 答案相反,两种方式的效率都没有太大差异(我想通过首先检查最有可能不同的列,CPU 时间可能会有一点好处,从而可能避免需要对复合键中的第二个键列,但即使为真,这也将是微优化)

有时这对于工作负载中的其他查询是有意义的。例如,如果分别针对 A 和 B 进行查询,并且索引未涵盖其中任何一个,但其中一列的选择性足以制定值得进行查找的计划,那么在这种情况下,将最具选择性的放在首位是有意义的。