Spiga

2021年11月的文章归档

sqlserver索引优化

2021-11-14 11:12:25

摘要:一、基础概念 1. 聚集索引(Clustered Index) 结构特点 数据存储: 聚集索引决定了表中数据的物理存储顺序。 表中的每一行数据都会按照聚集索引的键值进行排序存储。 叶节点: 聚集索引的叶节点包含实际的数据行。 叶节点的数据行是按照聚集索引的键值连续存储的。 唯一性: 每个表只能有一个聚集索引。 聚集索引的键值必须是唯一的,除非在创建时允许重复键值(通过 ALLOW_ROW_LOCKS 和 ALLOW_PAGE_LOCKS 选项)。 存储效率: 由于数据按照键值连续存储,聚集索引在范围查询和排序操作中非常高效。 如果表中有大量数据,聚集索引的维护成本相对较高,因为插入、删除和更新操作需要重新排列数据。 使用场景 范围查询: 适用于需要频繁进行范围查询(如 BETWEEN、、)的表。 排序和分组: 适用于需要频繁进行排序和分组操作的列。 主键: 通常主键会创建为聚集索引,因为主键需要唯一标识每一行数据,并且主键列通常用于范围查询和排序操作。 数据访问模式: 适用于访问模式以顺序访问数据为主的场景。 2. 非聚集索引(Non-Clustered Index) 结构特点 数据存储: 非聚集索引的键值存储的是指向实际数据行的指针。 表中的数据行可以按照插入顺序或其他顺序存储,但非聚集索引提供了一种快速查找数据的方式。 叶节点: 非聚集索引的叶节点包含指向实际数据行的指针。 叶节点的数据行指针是按照非聚集索引的键值排序的。 唯一性: 每个表可以有多个非聚集索引。 非聚集索引的键值可以是唯一的,也可以不唯一。 存储效率: 非聚集索引的维护成本相对较低,因为插入、删除和更新操作不会重新排列实际数据行。 非聚集索引可以提高特定列的查询性能,但对整个表的数据存储没有影响。 使用场景 等值查询: 适用于需要频繁进行等值查询(如 =、IN)的列。 范围查询: 虽然非聚集索引也可以用于范围查询,但效率可能不如聚集索引,尤其是在范围较大时。 排序和分组: 适用于需要频繁进行排序和分组操作的列…… 阅读全文