通过将非键列添加到非聚集索引的叶级,扩展非聚集索引的功能。 通过包含非键列,可以创建覆盖更多查询的非聚集索引
通过把包含的列同时维护在索引页,达到当查询的数据都包含在索引中的数据的时候,因为在索引页找到所有数据,就不需要访问表的数据页,从而减少I/O操作,这种通常称为“覆盖查询”
创建准则
1. 必须至少定义一个键列
2. 在 CREATE INDEX 语句的 INCLUDE 子句中定义非键列
3. 只能对表或索引视图的非聚集索引定义非键列
4. 允许除 text、 ntext和 image之外的所有数据类型
5. 精确或不精确的确定性计算列都可以是包含列
6. 不能同时在 INCLUDE 列表和键列列表中指定列名
7. INCLUDE 列表中的列名不能重复
8. 索引键列(不包括非键)必须遵守现有索引大小的限制
9. 所有非键列的总大小只受 INCLUDE 子句中所指定列的大小限制;例如, varchar(max) 列限制为 2 GB
适合使用非聚集索引包含列
1. 筛选的列是索引键 && 查询的列都是包含的列
不适合使用非聚集索引包含列
2. 筛选的列不是索引键 || 查询的列有不在包含列中的
TSQL创建筛选索引
CREATE INDEX IX_TableName_FieldName ON DataTable(Field1 ASC) INCLUDE(Field2)