SQL服务器创建一个列多个非聚集索引VS在短短的一个指数具有多列(SQL Server creati

2019-08-04 17:17发布

假设我有如下表

  • UserID (身份)PK
  • UserName -独特的非空
  • UserEmail -独特的非空

建议最佳的性能是什么?

  • 创建非聚集索引UserNameUserEmail分别

要么

  • 只需一个既包括列

请你分享你的想法,为什么一个是比其他优选的。

Answer 1:

另一个需要考虑的很重要的一点是:如果n个最左侧的列被引用一个复合索引(多列组成)将只用于(例如在WHERE子句)。

所以,如果你有一个单一的复合指数

(UserID, UserName, UserEmail)

那么这个指数可能会在下列情况下使用:

  • 当您正在搜索UserID单独(仅使用1最左边的列- UserID
  • 当您正在搜索UserIDUserName (使用2最左边的列)
  • 当你搜索所有三列

但这种单一的化合物指数将永远无法被用于搜索上

  • 只是UserName -这是在索引的第二列,因此不能永远使用这个指标
  • 只是UserEmail -这是该指数第三列,因此不能永远使用这个指标

只要记住这一点 - 仅仅是因为一列是部分指标并不一定意味着对单次的搜索栏将单独支持,并通过指数加速!

所以,如果您的使用模式和应用程序真的需要搜索UserName和/或UserEmail单独(无需提供其他搜索值),那么你必须在这些列上创建单独的指数-只是一个单一的化合物中的一个将不会有任何好处可言。



Answer 2:

最好的方式来定义索引完全取决于你将如何使用表。 现在只是通过看表定义选择索引没有合理的方式。

如果你的代码通过表格检索与用户名或通过另一个用户名表连接你的表,不是明智的做法是定义在该列的索引。 如果你的代码加入与使用两列(用户名和usermail),另一表的表不是明智的做法定义为指数这两列。 由于所有的列被定义为唯一的,我很难相信这会是这样的情况下你不需要该表多列索引。

有可能是使用多列索引一些额外的建议:多列索引也用于该部分符合索引过滤器,但与条件。
例如:如果你定义的用户名和usermail(在给定的顺序)两列的索引,你会在搜索该过滤器通过两列(用户名和usermail)的性能增益。 与该指数也将在使用用户名过滤器的性能提升,只是因为这是该指数的第一列,而不是通过usermail搜索,这是因为指数的第二列不能单独使用。
规则是:一个索引可以被用于与精确匹配列过滤或与匹配的索引定义随后的顶部上的列即列的子集进行滤波。



Answer 3:

请你分享你的想法,为什么一个是比其他优选的。

这要看你怎么做。

看,指数仅用于“从左到右”。 因此,在用户名的东印度; 用户名是无用的,如果我的用户名只能选择过滤。

一般来说,我会在这里假设三个指标:

  • Uniuqe指数,在用户名集群,作为主键。
  • 在用户名唯一索引,非集群。
  • 在USEREMAIL唯一索引,非集群。

原因是完全不适合的性能,但是:

  • 您需要首先为forein键关系的主键。
  • 你所需要的另外两个妥善处理唯一约束 - 有没有办法做到这一点没有指标。

此外,您需要灵活性的用户名和USEREMAIL,这意味着它不可能只是结合他们所追求的。

性能真的最后进入这里 - 为performacneË考虑所有这些指标可以包含所有附加字段(而不是指数,而是作为包含列的一部分,但说真的,没有其他有此表的工作,除非你alow多个注册明智的方法对于同一个用户。



文章来源: SQL Server creating multiple nonclustered indexes for one column vs having multiple columns in just one index