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显示查询计划。

待续、更新中


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

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

相关推荐
yatingliu201938 分钟前
HiveQL | 个人学习笔记
hive·笔记·sql·学习
造梦师阿鹏1 小时前
004.从 API 裸调到 LangChain
经验分享·ai·大模型·ai技术·大模型应用开发
薛晓刚3 小时前
当MySQL的int不够用了
数据库
SelectDB技术团队3 小时前
Apache Doris 在菜鸟的大规模湖仓业务场景落地实践
数据库·数据仓库·数据分析·apache doris·菜鸟技术
星空下的曙光3 小时前
mysql 命令语法操作篇 数据库约束有哪些 怎么使用
数据库·mysql
小楓12013 小时前
MySQL數據庫開發教學(一) 基本架構
数据库·后端·mysql
染落林间色3 小时前
达梦数据库-实时主备集群部署详解(附图文)手工搭建一主一备数据守护集群DW
数据库·sql
颜颜yan_4 小时前
企业级时序数据库选型指南:从传统架构向智能时序数据管理的转型之路
数据库·架构·时序数据库
lichenyang4534 小时前
管理项目服务器连接数据库
数据库·后端
沙振宇4 小时前
【数据库】通过‌phpMyAdmin‌管理Mysql数据
数据库·mysql