Spiga

标签为数据库的文章

sqlserver索引优化

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…… 阅读全文