哈喽
太长时间没有更新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 (数据库名,表名|视图名,索引名)
记得点赞加关注偶