SQL 中: 索引的建立和删除

目录

实验过程

1 在STUDENT表的sno列上创建一个非聚簇索引,索引名为"student_sno_idx"。

CREATE INDEX student_sno_idx 
ON STUDENT (sno);

2.在STUDENT表上按sno的升序,sname的降序创建一个复合索引,索引名为"student_sno_sname_idx"。

Create clustered index   student_sno_sname_idx
on STUDENT (sno  ASC,sname DESC )

3.把STUDENT表上的索引student_sno_sname_idx更名为"IX_sno_sname"。

EXEC sp_rename 'student.student_sno_sname_idx', 'IX_sno_sname', 'INDEX';
-- sql server的重命名命令

4.在COURSE表的cno列上创建唯一聚簇索引,索引名为"course_cno_idx"。

-- 手动删除主键聚集索引
CREATE UNIQUE CLUSTERED INDEX course_cno_idx 
ON COURSE(cno);

5.使用存储过程sp_helpindex查看STUDENT表中的索引信息。

EXEC sp_helpindex 'STUDENT';

6.删除STUDENT表中的索引IX_sname。

7.使用存储过程sp_rename将索引student_sno_idx改名为"student_sno"。

use suoyin

EXEC sp_rename 'student.student_sno_idx', 'student_sno', 'INDEX';

六、分析索引

1.指明引用索引

SELECT 目标列表达式 FROM 表名 WITH (INDEX (索引名)) WHERE 查询条件

这个 SQL 命令语法用于指定在查询过程中使用特定的索引。

索引名:要在查询中使用的索引的名称。

WITH (INDEX (索引名)) : 用来指定在执行查询时使用特定的索引。这可以用于强制查询优化器使用特定的索引,而不是根据统计信息和查询条件自行选择索引。

使用这个语法时,需要确保指定的索引名是存在的. 在某些情况下,强制使用特定的索引可能会提高查询性能,但在其他情况下可能会降低性能。因此,在使用这个语法时,需要谨慎评估是否真正需要强制使用特定的索引。

如:

select sage

from student

with(index (IX_sage))

where sage>18;

2.使用SHOWPLAN_ALL分析索引

设置是否显示查询计划的命令为:

SET SHOWPLAN_ALL ON|OFF

SET SHOWPLAN_TEXT ON|OFF

必须要有相应的权限

SET SHOWPLAN_ALL ON|OFF命令 与SET SHOWPLAN_TEXT ON|OFF命令 ,是返回有关语句执行情况的详细信息,并估计语句对资源的需求。
而错误提示:
SET SHOWPLAN 语句必须是批处理中仅有的语句。

解决:

加三个go ,批处理开头以go开始
go
SET showplan_all on

go
SELECT * 
FROM student 

go
SET showplan_all  OFF

8.使用IX_sno_sname查询名叫"刘云云"的学生的信息。

select * 
from student 
with (index(IX_sno_sname))
where sname ='刘云云'

9.如果不使用索引IX_sno_sname,此次查询如何完成?

select * 
from student 
where sname ='刘云云'

创建索引

语法:

CREATE [UNIQUE]  [CLUSTERED | NONCLUSTERED]   INDEX  <索引名> 
ON <表名>  (<列名> [ASC|DESC]  [,...n] )

例如:

在STUDENT表上按sno的升序,sname的降序创建一个复合索引,索引名为"student_sno_sname_idx

sql 复制代码
Create  index    student_sno_sname_idx
on STUDENT (sno  ASC,cno DESC )
-- CLUSTERED:可选,表示指定创建的索引为聚集索引
-- NONCLUSTERED:可选,表示指定创建的索引为非聚集索引

作用:

不必全盘扫描全部表内容
类似指针,书页目录

创建索引条件(经验)

创建查询的l列:
主码/外码/经常使用的列

创建索引后会有索引码 / 指针,也会占用物理磁盘空间,需要合理创建索引

分类:

聚簇索引

创建该索引后, 表中数据行的物理存储顺序与索引顺序完全相同,  表中有主码时会自动创建聚簇索引

只能有一个主码,一个聚簇索引

非聚簇索引

不改变表中数据行的物理存储顺序,即表中的数据行不按索引码的次序存储。在非聚簇索引中,每个索引都有指针指向包含该键值的数据行
bash 复制代码
聚集索引一个表只能有一个,而非聚集索引一个表可以存在多个

DBMS向导创建索引

命令创建索引

  1. 在COURSE表的cno列上创建唯一聚簇索引,索引名为"course_cno_idx"
sql 复制代码
CREATE UNIQUE CLUSTERED INDEX course_cno_idx 
ON COURSE(cno);
-- 必须先删除自动为主键创建的聚集索引, 且也要删除与之关联的外键表的约束

修改索引

例如:

sql 复制代码
-- sql server的重命名索引命令
--语法
-- EXEC sp_rename 'table_name.old_index_name', 'new_index_name', 'INDEX';

EXEC sp_rename 'student.student_sno_sname_idx', 'IX_sno_sname', 'INDEX';

--oracle 
ALTER INDEX old_index_name
 RENAME TO new_index_name;

删除索引

例如:

删除STUDENT表中的索引IX_sname

sql 复制代码
DROP INDEX IX_sname
ON student ;

查询索引

查询过程中使用特定的索引

语法:

SELECT 目标列表达式

FROM 表名

WITH (INDEX (索引名))

WHERE 查询条件;

WITH (INDEX (索引名)) : 用来指定在执行查询时使用特定的索引。

例如:

sql 复制代码
select sage
from student
with(index (IX_sage))
where sage>18;

结果:

查看索引信息

sql 复制代码
EXEC sp_helpindex 'STUDENT';

分析索引

SHOWPLAN_ALL 分析索引

设置是否显示查询计划的命令为:
SET SHOWPLAN_ALL ON|OFF
或
SET SHOWPLAN_TEXT ON|OFF

如何才能检测查询使用了哪个索引呢?SQL Server提供了多种分析索引和查询性能的方法,其中最常用的是SHOWPLAN_ALL方法。
显示查询计划就是SQL Server将显示在执行查询的过程中连接表时采取的每个步骤,以及是否选择及选择了哪个索引,从而帮助我们分析有哪些索引被系统采用。
通过在查询语句中设置SHOWPLAN_ALL选项,可以选择是否让SQL Server显示查询计划。

待续、更新中


以上就是今日博客的全部内容了

创作不易,若对您有帮助,可否点赞、关注一二呢,感谢支持.

相关推荐
Mephisto.java2 分钟前
【大数据学习 | kafka高级部分】kafka的文件存储原理
大数据·sql·oracle·kafka·json
十叶知秋32 分钟前
【jmeter】jmeter的线程组功能的详细介绍
数据库·jmeter·性能测试
Jack黄从零学c++1 小时前
C++ 的异常处理详解
c++·经验分享
瓜牛_gn2 小时前
mysql特性
数据库·mysql
奶糖趣多多3 小时前
Redis知识点
数据库·redis·缓存
数新网络4 小时前
《深入浅出Apache Spark》系列②:Spark SQL原理精髓全解析
大数据·sql·spark
CoderIsArt4 小时前
Redis的三种模式:主从模式,哨兵与集群模式
数据库·redis·缓存
师太,答应老衲吧6 小时前
SQL实战训练之,力扣:2020. 无流量的帐户数(递归)
数据库·sql·leetcode
Channing Lewis7 小时前
salesforce case可以新建一个roll up 字段,统计出这个case下的email数量吗
数据库·salesforce
毕业设计制作和分享9 小时前
ssm《数据库系统原理》课程平台的设计与实现+vue
前端·数据库·vue.js·oracle·mybatis