SQL Server从入门到精通(六)

哈喽

太长时间没有更新SQL Server是不是大家把以前学的知识都给忘记了,忘记了就赶紧回顾学习

在这里插入图片描述
往期精选
SQL Server从入门到精通(一)
SQL Server从入门到精通(二)
SQL Server从入门到精通(二)精讲
SQL Server从入门到精通(三)
SQL Server从入门到精通(四)
SQL Server从入门到精通(五)

目录
一、索引的概述
二、索引的类型
三、索引的创建和使用
四、查询中的执行计划
五、索引使用中的维护
好了今天我们就正式进入SOL Server的学习

一、索引的概述

1.索引是SQL 编排数据的内部方法,为SQL Server提供了一种方法来编排查询数据

2.索引的分类:
(1)聚集索引:正文内容本身就是一种按照一定规则排列的目录称为“聚集索引”,例如新华字典里面的所有字按照abcd排列
(2)非聚集索引:目录纯粹是目录,正文纯粹是正文的排序,例如:新华字典里按照偏旁查询字,偏旁在一个空间,字在一个空间

3.作用大大提高数据库的检索速度,改善数据库性能

4.建立索引的原则:
  1.每个表只能创建一个聚集索引
  2.每个表最多可以创建249个非聚集索引
  3.在经常查询的字段上建立索引
  4.text,image,bit数据类型的列上不要建立索引
  5.外键列可以建立索引
  6.主键列必须建立索引
  7.重复值比较多,查询较少的列上不要建立索引

二、索引的类型

文字多主要是让大家理解,省略一点总感觉怪怪滴

1.聚集索引和非聚集索引
行的物理存储顺序与索引顺序完全相同,每个表只允许建立一个聚集索引。而非聚集索引不改变表中数据行的物理存储顺序。
使用聚集索引检索数据要比非聚集索引快。SQL Server 为主键约束建立的索引为聚集索引,但这一默认设置可以使用 NONCLUSTERED 关键字改变。同样,默认情况下,SQL Server 为 UIQUE 约束所建立的索引为非聚集索引,这一默认设置可以使用 CLUSTERED 关键字改变。
在 CREATE INDEX 语句中,使用CLUSTERED 选项可以建立聚集索引。

聚集索引可以使用 NONCLUSTERED 关键字改变为非聚集索引。
一个表最多可以建立 249 个非聚集索引。

2.主键索引和非主键索引
表定义主键时自动创建主键索引,并且会自动创建聚集索引。
非主键索引是在非主键的属性列上创建的索引,这些索引一般都是非聚集索引,除非主键索引通过 NONCLUSTERED 关键字改变为非聚集索引,才可以在某个非主键列上创建聚集索引。

3.惟一索引和非惟一索引
惟一索引可以确保索引列中不包含重复值。
如果某列包含多行 NULL 值,不能在该列上创建惟一索引。
在 CREATE TABLE 或 ALTER TABLE 语句中设置 PRIMARY KEY 约束或 UNIQUE
约束时,SQL Server 自动为这些约束创建惟一索引;在 CREATE INDEX 语句中使用 UNIQUE
选项也可创建惟一索引。

4.单列索引
单列索引是指对表中单个列建立索引。多数情况下,单列索引是创建索引首选考虑的索
引。因为单列索引代价相对较小,而对数据库查询效能提高很大。

5.单列索引和复合索引
单列索引是指对表中单个列建立索引。
而一个索引中包含了一个以上的列称为复合索引,最多可以有 16 个列复合到一个索引中,并且这些列必须位于同一个表中,复合的多列索引允许某一列具有相同的值。
复合索引值的最大长度为 900 个字节。
例如,不可定义为
char(300)、char(300)和 char(301)的三个列上创建单个索引,因为总宽度超过了 900 字节。
在使用复合索引检索时,把被索引的列作为一个单位。复合索引中的列顺序可以和表中
的列顺序不同。在复合索引中应该首先定义最可能具有惟一性的属性列。

三、索引的创建和使用

索引的创建
在这里插入图片描述
在这里插入图片描述
使用T—SQL 语句创建索引

USE xmgl
GO   --创建索引
IF EXISTS(SELECT* FROM sysindexes WHERE name='emp_id')--创建索引之前要判断是否存在索引
DROP INDEX UserInfo.emp_id--表名.索引名
GO--先判断索引是否存在存在则删除 GO 批处理
CREATE NONCLUSTERED INDEX emp_id-- NONCLUSTERED 非聚集索引 INDEX代表创建的是索引
ON 员工表(员工号)--ON代表在哪个表哪个列(索引关键字)
WITH  FILLFACTOR =80  --代表填充因子为80
GO

在这里插入图片描述
重命名 索引名这里小编顺带扩展一下
修改表名

--修改表名
EXEC sp_rename @objname = '旧表名', @newname = '新表名'
EXEC sp_rename '旧表名', '新表名'
exec sp_rename @objname='emp_id',@newname='员工表_员工号',@objtype='index'--修改索引名的方法一
GO
exec sp_rename'emp_id','员工表_员工号','index'   --修改索引名的方法二 
GO

修改字段名

 --修改列名
EXEC sp_rename @objname = '表名.旧列名', @newname = '新列名', @objtype = 'column'
EXEC sp_rename '表名.旧列名', '新列名', 'column'

--例1 把表TABLE的列tid改为id
EXEC sp_rename @objname = 'TABLE.tid', @newname = 'id', @objtype = 'column'

--例2(简写)把表TABLE的列tid改为id
EXEC sp_rename 'TABLE.tid', @newname = 'id', @objtype = 'column'

修改索引名

--修改索引名
EXEC sp_rename @objname = '表名.旧索引名', @newname = '新索引名', @objtype = 'index'
EXEC sp_rename '表名.旧索引名', '新索引名', 'index'

--例1 把表TABLE的列tid改为id
EXEC sp_rename @objname = 'TABLE.IDX_TYPE_CODE', @newname = 'IDX_CODE', @objtype = 'index'

--例2(简写)把表TABLE的索引IDX_TYPE_CODE改为IDX_CODE
EXEC sp_rename 'TABLE.IDX_TYPE_CODE', 'IDX_CODE', 'index'

删除索引
语法

--声明数据库引用
use 数据库名;
go

--删除索引
if exists(select * from sysindexes where name=索引名称)
drop index 索引名称 on 表名;
go

示例:

--声明数据库引用
use testss;
go

--删除索引
if exists(select * from sysindexes where name='pathxmlindex')
drop index pathxmlindex on test1;
go

索引的使用## 标题在这里插入图片描述

四、查询中的执行计划

索引和为索引执行计划比较
区别是,
有索引的:一般是索引扫描或聚集索引扫描 (seek)
没有索引的:是表扫描(sacn)
现在查询分析器已经很智能了,某些表有索引的情况下,也不是一定使用索引,它会判断io、预读,来自动的使用表扫描和索引扫描。
1.检测堆结构
2.检测聚集索引
3.检测非聚集索引

数据查询方式
这里就大家来看这几张图的讲解吧,小编自己说也说不清楚

在这里插入图片描述
在这里插入图片描述

五、索引使用中的维护

创建了索引就要维护,来保证索引的统计信息是有效的,这样才能提高查找速度
维护索引的统计信息

--显示指定索引的统计信息。
USE教学管理
GO
DBCC SHOW STATISTICS(学生表备份, CLID X学生表备份身份)
--显示学生表_备份上CLID X_学生表_备份_身份索引的统计信息
GO


---更新指定表的索引统计信息。
USE教学管理
  GO
  UPDATE STATISTICS 学生表     --更新学生表的所有索引的统计GO


--对指定数据库中所有表的索引统计进行更新。
 USE教学管理
  GO
 EXECUTE sp_updatestats

维护索引锁片
索引碎片类型
内部碎片:当索引页里还有空间可以利用,出现的碎片是内部碎片
外部碎片:当数据页的逻辑顺序和物理顺序不匹配,或者一个表的存储区不连续,出现的碎片是外部碎片

索引碎片的检测
语法DBCC SHOWCONTING 命令查看索引碎片
语法格式:

DBCC SHOWCONTING(表名,索引名)

例题

USE 教学管理
GO
DBCC SHOWCONTING(学生表_备份)

重新和整理索引
(1)DROP INDEX 和CREATE INDEX
(2)DBCC DBREINDEX在一次操作里重建一个表上的所有索引,但重建索引时表不可用
(3)DBCC INDEXDEFRAG删除索引碎片,提高索引扫描性能
格式;
DBCC INDEXDEFRAG (数据库名,表名|视图名,索引名)

记得点赞加关注偶
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_46315852/article/details/104915484