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
相关文章
|
12天前
|
SQL IDE Java
Java连接SQL Server数据库的详细操作流程
Java连接SQL Server数据库的详细操作流程
|
10天前
|
SQL 存储 关系型数据库
不懂索引,简历上都不敢写自己熟悉SQL优化
大家好,我是考哥。今天给大家带来MySQL索引相关核心知识。对MySQL索引的理解甚至比你掌握还重要,索引是优化SQL的前提和基础,我们一步步来先打好地基。当MySQL表数据量不大时,缺少索引对查询性能的影响都不会太大,可能都是0.0几秒;但当表数据量逐日递增时,建立一个合适且优雅的索引就至关重要了。
798 1
不懂索引,简历上都不敢写自己熟悉SQL优化
|
4天前
|
SQL 关系型数据库 分布式数据库
PolarDB产品使用问题之如何迁移SQL Server
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
20小时前
|
SQL 存储 测试技术
|
3天前
|
SQL 存储 机器人
SQL Server 中 RAISERROR 的用法详解
SQL Server 中 RAISERROR 的用法详解
|
12天前
|
SQL 存储 关系型数据库
MySQL数据库进阶第二篇(索引,SQL性能分析,使用规则)
MySQL数据库进阶第二篇(索引,SQL性能分析,使用规则)
|
2天前
|
SQL 存储 关系型数据库
1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server
1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server
|
3天前
|
SQL 关系型数据库 MySQL
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version
|
3天前
|
SQL 关系型数据库 分布式数据库
PolarDB产品使用问题之如何查看SQL语句使用的是行索引还是列索引
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
4天前
|
SQL 存储 关系型数据库
Mysql-事务-锁-索引-sql优化-隔离级别
Mysql-事务-锁-索引-sql优化-隔离级别