Design5:索引设计
在SQL Server中,一个表只有两种存储结构:Heap和B-Tree,Heap是指没有创建聚集索引的表,B-Tree 结构是指已经创建聚集索引的表。
一,Heap和B-Tree的选择
索引是为了提高查询性能而设计的存储结构,索引是独立于“数据”之外的数据结构,设计目标是为了查找数据,例如,对于聚集索引,叶子节点存储的是数据,非叶子节点上存储的是索引结构。
在更新数据时,SQL Server需要维护索引结构的更新,这可能会降低数据更新的性能,注意,是可能降低数据更新的性能,而不是一定会降低数据更新的性能。
要根据对表操作的类型来选择表的存储结构:
- 如果一个表纯粹只是为了存储数据,而不进行查询,那么推荐不创建任何索引,使得该表不用维护任何索引结构,表的存储结构就是Heap。
- 如果一个表不仅存储数据,而且还会查询数据,那么推荐在表上创建聚集索引,把表结构转换为B-Tree结构。举个例子,通常,带where条件的Update操作,首先需要查找到数据,然后再更新数据。
注意,一个表只能创建一个聚集索引,从SQL Server 2016开始,可以表上创建的聚集索引,要么是rowstore的聚集索引,要么是columnstore的聚集索引。
二,索引的选择
对于Disk-base的表上索引,从存储格式上来看,可以分为rowstore和columnstore:
- 由于rowstore索引使用平衡树结构来存储数据,特别使用对单行数据或少量数据行的查找;由于rowstore索引是有序的,因此适合用于范围查找。
- columnstore索引有更高的压缩效率,特别适合用于数据仓库中的分析查询,即通过少量的维度对事实表的一个或多个数据列进行聚合查询。
对于内存优化表,可以在表上创建Hash索引,
- 哈希索引没有顺序,存储在内存中,是单行数据查询性能最高的索引类型。
三,聚集索引和非聚集索引
由于聚集索引实际上就是表,叶子节点是表数据,非叶子节点是索引的结构。
非聚集索引实际上是建立在聚集索引的结构之上的,推荐先创建聚集索引,然后创建非聚集索引。
四,索引的填充、重建和重组
为了最大程度的从索引结构中获得高的查询性能,在创建索引时,应考虑填充,以减少页拆分(Page Split)的数量;数据的更新会导致索引碎片,需要重建或重组索引,以整理碎片,提高查询性能。
推荐阅读:《索引调优 第一篇:重建、填充和查找》,《索引调优 第二篇:碎片整理》
参考文档:
作者:悦光阴
本文版权归作者和博客园所有,欢迎转载,但未经作者同意,必须保留此段声明,且在文章页面醒目位置显示原文连接,否则保留追究法律责任的权利。