适用于:SQL Server
Azure SQL 数据库
Azure SQL 托管实例
Microsoft Fabric 中的 SQL 数据库
本文介绍了如何使用 SQL Server Management Studio 或 Transact-SQL 来添加包含列(或非键列),以便在 SQL Server 中扩展非聚集索引的功能。 通过包含非键列,可以创建覆盖更多查询的非聚集索引。 这是因为非键列具有下列优点:
- 它们可能属于不能用作索引键列的数据类型。
- 在计算索引键列数或索引键大小时,数据库引擎不考虑它们。
当查询中的所有列都作为键列或非键列包含在该索引中时,包含非键列的索引可以显著提高查询性能。 这样可以实现性能提升,因为查询优化器可以在索引中找到所有列值;不访问表或聚集索引数据,从而减少磁盘 I/O 操作。
Note
索引包含查询引用的所有列时,通常称为 覆盖查询。
设计建议
重新设计索引键大小较大的非聚集索引,以便只有用于搜索和查找的列为键列。 使覆盖查询的所有其他列成为非键列。 这样,你就会拥有覆盖该查询所需的所有列,但索引键本身仍然较小且高效。
将非键列包含在非聚集索引中,以避免超过当前索引大小的限制(最大键列数为 32,最大索引键大小为 1,700 字节,而在 SQL Server 2016 (13.x) 以前,最大键列数为 16,最大索引键大小为 900 字节)。 数据库引擎计算索引键列数或索引键大小时,不考虑非键列。
索引定义中非键列的顺序不会影响使用该索引的查询的性能。
避免使用非常宽泛的非聚集索引,其中的包含列不代表一个足够窄小的基础表列的子集。 如果添加宽泛索引,务必验证更新一个额外的宽泛索引的成本是否抵消了直接从表中读取的成本。
局限性
非键列只能在非聚集索引上定义。
除了 text、 ntext和 image 之外的所有数据类型都可以用作非键列。
精确或不精确的确定性计算列都可以是非键列。 有关详细信息,请参阅计算列上的索引。
只要允许将计算列数据类型作为非键索引列,从 image、 ntext和 text 数据类型派生的计算列就可以作为非键索引列。
除非先删除某一表的索引,否则无法从该表中删除非键列。
除进行以下更改外,不能对非键列进行其他更改:
将列的可空性从
NOT NULL更改为NULL。增加 varchar、 nvarchar 或 varbinary 列的长度。
安全性
Permissions
需要具有对表或视图的 ALTER 权限。 用户必须是 sysadmin 固定服务器角色的成员,或者是 db_ddladmin 和 db_owner 固定数据库角色的成员。
使用 SQL Server Management Studio 创建包含非键列的索引
在对象资源管理器中,选择加号以便展开包含要在其中创建带有非键列索引的表的数据库。
选择加号以展开表格文件夹。
选择加号以便展开要在其中创建带有非键列的索引的表。
右键单击“索引”文件夹,指向“新建索引”,然后选择“非群集索引…”。
在 “新建索引” 对话框的 “常规” 页中,在 “索引名称” 框中输入新索引的名称。
在“索引键列”选项卡下,选择“添加…”。
在“从 table_name 中选择列”对话框中,选中要添加到索引的一个或多个表列的复选框。
选择“确定”。
在“包含列”选项卡下,选择“添加…”。
在从table_name 表中选择列对话框中,选中要作为非键列添加到索引中的表列的复选框。
选择“确定”。
在“新建索引”对话框中,选择“确定”。
使用 Transact-SQL 创建包含非键列的索引
在 “对象资源管理器” 中,连接到数据库引擎实例。
在标准栏上,选择“新建查询” 。
将以下示例复制并粘贴到查询窗口中,然后选择“执行”。
USE AdventureWorks2022; GO -- Creates a nonclustered index on the Person.Address table with four included (nonkey) columns. -- index key column is PostalCode and the nonkey columns are -- AddressLine1, AddressLine2, City, and StateProvinceID. CREATE NONCLUSTERED INDEX IX_Address_PostalCode ON Person.Address (PostalCode) INCLUDE (AddressLine1, AddressLine2, City, StateProvinceID); GO