1. 什么是包含性列
包含性列指的是索引数据中包含了非索引列的数据,可以直接从一个包含性列中获取到所有需要的数据,而不必再查询表格中的数据。对于包含性列的索引,在执行SQL语句时,查询引擎不需要再回到表格进行查询,因为所有需要的数据都已经包含在了索引中,这就减少了查询的IO操作。
1.1 包含性列的优点
1. 减小了查询代价。
当数据表中需要查询的信息已经全部保存在包含性列中,查询引擎就无需再去数据表中查询,从而使查询效率得到提升,特别是当数据表中的行数非常巨大时,巨大的减少了IO操作的次数。
2. 优化了查询计划。
使用包含性列的索引可以优化查询计划,降低了索引项的数量,从而减少了检索的时间,提升了查询速度。
3. 提升索引的效率和可行性。
在业务中,经常需要根据多个列进行排序,但大多数数据库的索引大小是受限制的。使用包含性列的索引可以为多个列创建适当的索引,而不会增加索引的大小。
2. 包含性列的实现方式
在MSSQL中,包含性列可以通过在索引中包含非索引列的方式来实现。可以在创建索引时,加入包含性列的定义。创建包含性列的代码如下:
CREATE NONCLUSTERED INDEX IDX_INCL_COLUMN
ON dbo.MyTable (Column1)
INCLUDE (Column2, Column3)
上面的代码在创建一个非聚集索引,索引名为IDX_INCL_COLUMN,索引列为Column1,同时包含了Column2和Column3两个非索引列。
2.1 索引限制
包含性列有一些限制,以下是MSSQL中索引的限制:
在包含性列定义中包含的列是非键列。如果包含性列定义中包含了键列,则MSSQL自动将其包含在索引中。
在一个索引中,包含性列总大小不能超过900字节。如果定义的包含性列长度超过了这个限制,则可以采用PARTITIONED VIEW、OPTIMIZED or FILTERED INDEX等方法。
一般建议不要添加太多的包含性列,因为过多的包含性列会占用太多磁盘空间,同时会影响索引性能,导致CPU的开销过大。
3. 包含性列的使用场景
包含性列是一个非常实用的功能,在应用中也有很多的应用场景,如下:
3.1 覆盖索引
覆盖索引是指索引中除了包含索引列,还包含了查询所需的数据列。覆盖索引可以极大的提高查询速度,减少IO的操作,降低了CPU的开销。在MSSQL中,可以通过包含性列来实现覆盖索引,提高查询速度。
3.2 数据查询
包含性列可以提高查询的效率。如果查询语句中涉及的多个列都被包含在同一索引中,那么查询引擎就可以直接从索引中获取需要的数据,并能够有效减少查询所需的IO操作次数,降低了CPU的开销。
3.3 针对高并发的查询优化
在高并发的情况下,查询语句的执行速度会明显下降,这时可以通过添加包含性列来优化查询效率。包含性列可以有效降低查询所需的IO操作次数,提高查询的效率,使系统能够更好的应对高并发的查询情况。
4. 总结
包含性列是一个非常实用的功能,能够提高查询的效率,减少IO操作,降低了CPU的开销,特别是在高并发的情况下,使用包含性列优化查询效率非常有效。但是在使用包含性列时,也需要注意一些限制,例如不要添加太多的包含性列,不要在包含性列中包含键列,以及包含性列总大小不能超过900字节等。在使用包含性列时,可以通过实际的测试来确定最适合的包含性列配置,从而达到最好的查询性能。