SQL Server的聚集索引和非聚集索引的的创建和区别以及相关问题

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
简介: 以前很少关注索引这个东西,因为这个是DBA关注的,最近看书看了一下索引 ,把一些以前不太注意的的记录一下 下面这个表格是摘自:http://www.cnblogs.com/tuyile006/archive/2009/08/28/1555615.

     以前很少关注索引这个东西,因为这个是DBA关注的,最近看书看了一下索引 ,把一些以前不太注意的的记录一下

下面这个表格是摘自:http://www.cnblogs.com/tuyile006/archive/2009/08/28/1555615.html

动作描述    使用聚集索引 使用非聚集索引
外键列   应 
主键列 
列经常被分组排序(order by)   应
返回某范围内的数据 不应
小数目的不同值 不应
大数目的不同值  不应
频繁更新的列   不应
频繁修改索引列 不应
一个或极少不同值 不应 不应

     首先看看索引是怎么创建的,我比较菜,喜欢用管理工具

创建聚焦索引

image         

选择为那个字段创建索引是通过选择的

image

非聚焦索引只需要改一下类型即可

创建了两个一个聚焦索引一个非聚焦索引

image               

书上是这么解释聚焦索引和非聚焦索引的区别

表有两种组织形式,堆或B树

当在一个表上创建聚集索引时,表组织为一个B树(平衡树),否则组织为一个堆

还有sqlserver的存储单位

页:是sqlserver存储数据的最小单位,大小为8kb

区:是由8个物理上连续的页组织成的单位

页sqlserver最小的i/o读写单位,而i/o读写中开销最大的部分是磁盘臂(disk arm)的移动,

也就是说某个查询如果需要频繁的移动磁盘臂,那查询效率就低了,

什么原因会导致磁盘臂的移动?书商还没总结完。。。。。

书还没看完,感觉索引的碎片是会触发磁盘臂移动的一个关键因素

     不同于分配顺序扫描(非聚焦索引),索引有序扫描(聚焦索引)的性能取决于索引的碎片级别,如果没有任何碎片,索引的顺序扫描的性能非常接近分配顺序扫描的性能

分配顺序扫描是按照文件进行扫描,不受逻辑碎片的影响

     任何数据的更改(删除,插入,更新)都要在保存改数据的副本的索引中反映出来,这可能会引起页拆分,和平衡树的调整,这些操作的开销可能非常高。

碎片,什么是碎片?书翻N页后发现了

      碎片是指逻辑扫描碎片、平均碎片百分比或外部碎片,这类碎片表示索引中无序页所占的百分比,无序页是根据页的物理顺序和页在索引链表中的逻辑顺序来确定的,碎片对索引有序扫描影响非常严重

有一些sql语句可以查看当前数据库中每个表包含碎片的百分比,常用与索引优化

如果需要修复碎片,就需要重建索引

所以我的理解是

任何数据的更改(删除,插入,更新)都要在保存改数据的副本的索引中反映出来,这可能会引起页拆分,和平衡树的调整,从而产生碎片

     对与聚焦索引和非聚焦索引的区别使用

动作描述    使用聚集索引 使用非聚集索引
外键列   应 
主键列 
列经常被分组排序(order by)
返回某范围内的数据 不应
小数目的不同值 不应
大数目的不同值  不应 
频繁更新的列   不应
频繁修改索引列 不应
一个或极少不同值 不应 不应

不应使用聚焦索引的两种情况(红色部分),就是因为产生了大量的碎片

那绿色的是为什么呢?我又查了一下

sqlserver 查询优化器里面

如果该查询的【选择性】足够高,优化器会会使用这个索引。

选择性是指返回行数占表总行数的百分比,高选择性是指地百分比,低选择性是指搞百分比

所以我猜绿色部分和这个【选择性】密切相关,可能低选择性会导致整表扫描

关乎非聚焦索引 在粗体字那几个环境下,为什么不建议使用,还没找到原因

尤其是一个或极少不同值 两个索引都不让用表示非常费解,那该用啥呢?用户id不就是这种情况

test
相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
相关文章
|
2月前
|
SQL 存储 关系型数据库
如何巧用索引优化SQL语句性能?
本文从索引角度探讨了如何优化MySQL中的SQL语句性能。首先介绍了如何通过查看执行时间和执行计划定位慢SQL,并详细解析了EXPLAIN命令的各个字段含义。接着讲解了索引优化的关键点,包括聚簇索引、索引覆盖、联合索引及最左前缀原则等。最后,通过具体示例展示了索引如何提升查询速度,并提供了三层B+树的存储容量计算方法。通过这些技巧,可以帮助开发者有效提升数据库查询效率。
200 2
|
2月前
|
SQL Oracle 关系型数据库
SQL优化-使用联合索引和函数索引
在一次例行巡检中,发现一条使用 `to_char` 函数将日期转换为字符串的 SQL 语句 CPU 利用率很高。为了优化该语句,首先分析了 where 条件中各列的选择性,并创建了不同类型的索引,包括普通索引、函数索引和虚拟列索引。通过对比不同索引的执行计划,最终确定了使用复合索引(包含函数表达式)能够显著降低查询成本,提高执行效率。
|
3月前
|
存储 SQL 关系型数据库
【MySQL调优】如何进行MySQL调优?从参数、数据建模、索引、SQL语句等方向,三万字详细解读MySQL的性能优化方案(2024版)
MySQL调优主要分为三个步骤:监控报警、排查慢SQL、MySQL调优。 排查慢SQL:开启慢查询日志 、找出最慢的几条SQL、分析查询计划 。 MySQL调优: 基础优化:缓存优化、硬件优化、参数优化、定期清理垃圾、使用合适的存储引擎、读写分离、分库分表; 表设计优化:数据类型优化、冷热数据分表等。 索引优化:考虑索引失效的11个场景、遵循索引设计原则、连接查询优化、排序优化、深分页查询优化、覆盖索引、索引下推、用普通索引等。 SQL优化。
647 15
【MySQL调优】如何进行MySQL调优?从参数、数据建模、索引、SQL语句等方向,三万字详细解读MySQL的性能优化方案(2024版)
|
2月前
|
SQL 关系型数据库 MySQL
如何确认SQL用了索引:详细技巧与方法
在数据库管理中,索引是提高SQL查询性能的重要手段
|
3月前
|
存储 关系型数据库 MySQL
MySQL高级篇——覆盖索引、前缀索引、索引下推、SQL优化、主键设计
覆盖索引、前缀索引、索引下推、SQL优化、EXISTS 和 IN 的区分、建议COUNT(*)或COUNT(1)、建议SELECT(字段)而不是SELECT(*)、LIMIT 1 对优化的影响、多使用COMMIT、主键设计、自增主键的缺点、淘宝订单号的主键设计、MySQL 8.0改造UUID为有序
|
3月前
|
SQL 存储 索引
SQL Server的Descending Indexes降序索引
【9月更文挑战第21天】在SQL Server中,降序索引允许指定列的排序顺序为降序,可显著优化涉及降序排序的查询性能,特别是在复合索引中。通过创建降序索引,可以更高效地满足特定业务需求,如按交易时间降序获取最新记录。然而,使用时需考虑查询频率、数据分布及维护成本,以确保最佳性能。
|
2月前
|
SQL 存储 关系型数据库
SQL默认索引是什么:深入解析与技巧
在SQL数据库中,索引是一种用于提高查询性能的重要数据结构
|
2月前
|
SQL 存储 关系型数据库
SQL默认索引是什么
在SQL数据库中,索引是一种用于提高查询性能的数据结构
|
2月前
|
SQL 关系型数据库 MySQL
如何确认SQL用了索引
在数据库管理和优化过程中,确认SQL查询是否使用了索引是一个至关重要的步骤
|
2月前
|
SQL 关系型数据库 MySQL
如何确认SQL查询是否使用了索引:详细步骤与技巧
在数据库管理和优化中,确认SQL查询是否有效利用了索引是提升性能的关键步骤