sql-server - 复合非聚集索引和覆盖索引有什么区别

标签 sql-server indexing covering-index composite-index

SQL Server 2005 包含“覆盖索引”功能,该功能允许我们选择多个非键列来包含到现有的非聚集索引中。

例如,我有以下列:

EmployeeID, DepartmentID, DesignationID, BranchID

这里有两种情况:

  • EmployeeID 是主键 聚集索引和剩余的 列(DepartmentIDDesignationIDBranchID)被视为非集群 指数(综合指数)。

  • EmployeeID 是主键 聚集索引和 DepartmentID 是 非聚集索引 DesignationIDBranchID 已“包含” columns”用于非聚集索引。

上面两个有什么区别?如果两者相同,引入“覆盖指数”概念有什么新内容?

最佳答案

区别在于,如果第一个索引中有两行具有相同的 DepartmentID,则它们将根据 DesignationID 和 BranchID 的值进行排序。在第二种情况下,它们不会相对于彼此排序,并且可以以任何顺序出现在索引中。

就这对您的应用程序意味着什么而言:

  • 如果查询可以使用 (DepartmentID, DesignationID) 上的索引,则第一个查询的效率会比第二个查询的效率更高。
  • 由于需要额外的排序,构建第一个索引可能需要稍长的时间。

关于sql-server - 复合非聚集索引和覆盖索引有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3897203/

相关文章:

javascript - 比较两个不同数组的元素内部并给出操作?

mysql - 什么是 MySQL 覆盖索引?

sql-server - 如何按依赖顺序列出表(基于外键)?

sql-server - Perl -- 查询获取 Not Hash Reference 时的 DBI selectall_arrayref

Python pyodbc.row 列出

python - 查找大于 x 的元素的索引

sql - 访问每个标识符的最新行的正确方法?

php - 覆盖索引和mysql中的两个表

mysql - 复合索引在MySQL中有方向吗?

c# - EF.Functions.Like 方法在升级到 .NET 6 后不起作用