2021-11-14 11:12:25
摘要:一、基础概念
1. 聚集索引(Clustered Index)
结构特点
数据存储:
聚集索引决定了表中数据的物理存储顺序。
表中的每一行数据都会按照聚集索引的键值进行排序存储。
叶节点:
聚集索引的叶节点包含实际的数据行。
叶节点的数据行是按照聚集索引的键值连续存储的。
唯一性:
每个表只能有一个聚集索引。
聚集索引的键值必须是唯一的,除非在创建时允许重复键值(通过 ALLOW_ROW_LOCKS 和 ALLOW_PAGE_LOCKS 选项)。
存储效率:
由于数据按照键值连续存储,聚集索引在范围查询和排序操作中非常高效。
如果表中有大量数据,聚集索引的维护成本相对较高,因为插入、删除和更新操作需要重新排列数据。
使用场景
范围查询:
适用于需要频繁进行范围查询(如 BETWEEN、、)的表。
排序和分组:
适用于需要频繁进行排序和分组操作的列。
主键:
通常主键会创建为聚集索引,因为主键需要唯一标识每一行数据,并且主键列通常用于范围查询和排序操作。
数据访问模式:
适用于访问模式以顺序访问数据为主的场景。
2. 非聚集索引(Non-Clustered Index)
结构特点
数据存储:
非聚集索引的键值存储的是指向实际数据行的指针。
表中的数据行可以按照插入顺序或其他顺序存储,但非聚集索引提供了一种快速查找数据的方式。
叶节点:
非聚集索引的叶节点包含指向实际数据行的指针。
叶节点的数据行指针是按照非聚集索引的键值排序的。
唯一性:
每个表可以有多个非聚集索引。
非聚集索引的键值可以是唯一的,也可以不唯一。
存储效率:
非聚集索引的维护成本相对较低,因为插入、删除和更新操作不会重新排列实际数据行。
非聚集索引可以提高特定列的查询性能,但对整个表的数据存储没有影响。
使用场景
等值查询:
适用于需要频繁进行等值查询(如 =、IN)的列。
范围查询:
虽然非聚集索引也可以用于范围查询,但效率可能不如聚集索引,尤其是在范围较大时。
排序和分组:
适用于需要频繁进行排序和分组操作的列。
外键:
外键列通常会创建非聚集索引,以提高外键约束的性能。
数据访问模式:
适用于访问模式以随机访问数据为主的场景。
3. 索引优化规则
避免过多索引:
每个表的……
阅读全文
2019-11-16 15:35:24
摘要:影响性能因素
数据库结构设计
T-SQL语句
数据量大
事务和隔离级别
硬件资源
IO阻塞
批量删除表数据:大量删除时会记录到日志中,也会造成IO阻塞
优化和注意事项
了解业务
优先考虑第三范式设计,参考设计范式
表关联尽可能少
坚持最小原则
在适当的地方使用约束
用户数据和日志文件隔离存放
T-SQL语句优化
使用字段名,尽量不适用*
条件
从左边开始,先写最小条件锁定最少数据
索引
尽量使用索引字段
索引字段放到左边
不能计算也不要使用函数,否则索引失效
以小表关联大表
SQL语句尽量简单
执行计划
sql官方执行计划文档
执行计划图标和运算符
MSSQLSERVER执行计划详解 - 张龙豪 - 博客园
SQL Server执行计划的理解 - 馨馨妙 - 博客园
点击开启【包括实际的执行计划】
执行计划关键字和图标理解
表扫描:
Parameter Table Scan 运算符扫描在当前查询中用作参数的表。 该运算符一般用于存储过程内的 INSERT 查询。 Parameter Table Scan 既是一个逻辑运算符,也是一个物理运算符。
就是扫描查询列整个表全部数据,最耗时性能最低的。
嵌套循环:
Nested Loops 运算符执行内部联接、左外部联接、左半部联接和左反半部联接逻辑运算。 嵌套循环联接通常使用索引,针对外部表的每一行在内部表中执行搜索。 查询处理器根据预计的开销来决定是否对外部输入进行排序,以改进内部输入索引上的搜索定位。 将基于所执行的逻辑操作返回所有满足 Argument 列中的(可选)谓词的行。 如果 OPTIMIZED 特性设置为“True”,则表示使用了优化的嵌套循环(或批处理排序) 。 Nested Loops 是一个物理运算符。 有关详细信息,请参阅了解嵌套循环联接。
RID查询 :
RID Lookup 是使用提供的行标识符 (RID) 在堆上进行的书签查找。 Argument 列包含用于查找表中的行的书签标签和从中查找行的表的名称。 RID Lookup 通常带有 NESTED LOOP JOIN。 RID Lookup 是一个物理运算符。 有关书签查找的详细信息,请参阅 MSDN SQL Server 博客中的Bookmark Lookup(书签查找)。
哈希匹配:
Hash Ma……
阅读全文