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

待续、更新中


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

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

相关推荐
Channing Lewis17 分钟前
sql server如何创建表导入excel的数据
数据库·oracle·excel
秃头摸鱼侠18 分钟前
MySQL安装与配置
数据库·mysql·adb
UGOTNOSHOT22 分钟前
每日八股文6.3
数据库·sql
行云流水行云流水1 小时前
数据库、数据仓库、数据中台、数据湖相关概念
数据库·数据仓库
John Song1 小时前
Redis 集群批量删除key报错 CROSSSLOT Keys in request don‘t hash to the same slot
数据库·redis·哈希算法
IvanCodes1 小时前
七、Sqoop Job:简化与自动化数据迁移任务及免密执行
大数据·数据库·hadoop·sqoop
tonexuan1 小时前
MySQL 8.0 绿色版安装和配置过程
数据库·mysql
JohnYan1 小时前
工作笔记- 记一次MySQL数据移植表空间错误排除
数据库·后端·mysql
我最厉害。,。2 小时前
Windows权限提升篇&数据库篇&MYSQL&MSSQL&ORACLE&自动化项目
数据库·mysql·sqlserver
远方16092 小时前
20-Oracle 23 ai free Database Sharding-特性验证
数据库·人工智能·oracle