SQL 服务器索引——在复合键字段上创建非聚集索引有什么好处?

SQL Server Indexing -- Any benefits of creating a nonclustered index on composite key fields?

我在 table 的两个字段上有一个 PK (UtilityId, int & ACCT_NO varchar(100)) 我真的不知道顺序是否有所不同,但这是代码(首先是 UtilityId):

ALTER table AccountAddress
ADD CONSTRAINT [PK_AccountAddresses] PRIMARY KEY CLUSTERED (UtilityId,ACCT_NO)

如果我想在 UtilityId 上查询 table,在 UtilityId 上创建索引是否有益(也许我不需要这样做,因为系统定义了一个 PK——通过它索引是已经在那里了)。

相反,如果我想查询 ACCT_NO,这是索引定义中的第二个字段,那么,在 ACCT_NO 上创建索引是否有益?

"ordinary"(SQL 服务器 "relationnal" AKA B-Tree+)索引是一种向量。向量路径是键中所有列的复合,按键列表顺序排列。

查找的效率取决于 "ways" 您尝试检索数据的方式 例如:

CREATE INDEX X ON T (A, B, C)

在这些情况下对于平等寻求将是有效的:

  • A 和 B 和 C
  • A 和 B
  • 一个

但是对于平等的寻求来说效率不高:

  • B
  • C
  • 乙和丙

但是根据优化器的不同,如果基数估计器发现 return 的行数很少,它可以对索引进行扫描。

如果只想在 ACCT_NO 上查询,可以创建特定索引以提高性能。

索引的效率与查询中的谓词有关(WHERE 子句、连接的 ON 子句、HAVING、CASE……)。这称为 "sargable"(搜索参数 ABLE)。 例如 LIKE '%anyword%' 永远不会搜索,无论您有什么索引。