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)的数量;数据的更新会导致索引碎片,需要重建或重组索引,以整理碎片,提高查询性能。

推荐阅读:《索引调优 第一篇:重建、填充和查找》,《索引调优 第二篇:碎片整理

参考文档:

作者悦光阴
本文版权归作者和博客园所有,欢迎转载,但未经作者同意,必须保留此段声明,且在文章页面醒目位置显示原文连接,否则保留追究法律责任的权利。
原文地址:https://www.cnblogs.com/ljhdo/p/4554143.html