复习点
原则:建立索引是为了加快数据的查询速度,创建视图是为了满足用户对数据的不同需求。
一、索引的基本知识
1.索引属于数据库三级模式中的内模式范畴。
2.索引的类型:按照索引记录的结构和存放位置分
(1)聚簇索引:
- 把一个或多个属性(称为聚簇码)上具有相同值得元组集合放在连续的物理块中。(类似于字典中建立在拼音基础上的聚簇索引)
- 数据的排列顺序和数据输入的先后顺序无关,由聚簇码的值所决定
- 系统默认对主键约束自动创建聚簇索引,因此关系中的元组通常是按主码的值排序的。
- 一个表只能建立一个聚簇索引。
- 不适用于建立在数据更新较频繁的列上。
(2)非聚簇索引:
- 数据与索引的存储位置可以完全独立,索引中带有指向数据存储位置的逻辑指针,索引顺序与数据的物理排列无关。索引项是按照索引值顺序存储的。(类似于字典中按偏旁部首查找的方式)
- 一个表可以建立多个非聚簇索引。
- 一个表中插入新数据时,若这个表只有非聚簇索引,那么这个新数据会被插入到最末的一个数据页中;若这个表既有聚簇索引又有非聚簇索引,那么这个数据会先根据聚簇索引确定位置,再更新聚簇索引和非聚簇索引。
(3)其他索引:最常见的是唯一索引,索引列中不包含重复的值,即唯一索引中每一个索引都对应表中唯一的数据记录。
- 每个表可以建立多个唯一索引,只要保证唯一索引的列中没有重复的值即可。
- 聚簇索引和非聚簇索引都可以是唯一索引。
3.一条索引的基本信息包括:索引键值(key、即索引的字段值)和逻辑指针(pointer,指向数据页)
二、索引的基本操作
1.创建索引
CREATE [UNIQUE] [CLUSTERED | NINCLUSTERED] INDEX <索引名>
ON <表名> (<列名>[(次序)]……)
- UNIQUE表名要创建唯一索引。当表上创建唯一约束时,系统会自动在该列上建立唯一索引。
- CLUSTERED表示创建聚簇索引,默认为非聚簇索引。
- 建立在多个列上的索引被称为复合索引。在复合索引中,系统会按照索引列出现的先后顺序对索引项排序。如下面代码中就是先按照成绩升序排序,成绩相同是按学号升序排序,成绩学号都相同时按课程号升序排序。
- 次序是索引值的排列方式ASC表示升序,DESC表示降序。
CREATE UNIQUE INDEX 索引2
ON SC (成绩, 学号, 课程号)
2.查看索引
(1)查看一个表具有的索引
EXEC SP_HELPINDEX <表名>
EXEC SP_HELPINDEX SC
结果如下:
(2)具体查看某一个索引
a.SSMS菜单界面
b.SQL语句 DBCC SHOW_STATISTICS(表名,索引名)
DBCC SHOW_STATISTICS(SC,索引2)
结果如下:
3.索引的更新
问题的引入:
- 数据库中的数据要不断插入、删除修改,所以数据库管理员要定期索引进行分析和更新。
- 索引中每个叶子节点为一页,每页不可分隔且每页能存储的数据行数有限制,当新插入行时结点就要进行页拆分,拆分可能产生碎片,导致一个页上可能只有一个或几个数据,远远达不到饱和,造成了空间的浪费。
- 极端情况下,查询十行记录,可能需要加载10个页。所以引入索引的更新.
(1)方法一:整理索引碎片
DBCC INDEXDEFRAG(‘数据库名’,‘表名’,‘索引名’)
DBCC INDEXDEFRAG(学生选课记录,SC,索引2)
结果如下:
(2)方法二:重建索引
DBCC DBREINDEX(‘表名’,‘索引名’,‘索引因子’)
- 第一个参数可以是表名,也可以是表ID。
- 第二个参数可以通过索引名指定某个索引列,当用’ '代替时,表示重建所有索引。
- 索引因子说的是页的数据填充程度,当为100%时,查询效率最高,但是插入新的索引值时,就要移动后面所有的页,效率低。
DBCC DBREINDEX(SC,索引2,90)
结果如下:
4.索引的删除
- DROP INDEX <索引名> ON <表名或视图名>
- DROP INDEX <表名或视图名> . <索引名>
DROP INDEX 索引2 ON SC
需要注意的是,DROP 语句不能删除通过PRIMARY KEY 约束或者是UNIQUE KEY 约束创建的索引。
三、视图的基本知识
1.视图的种类:标准视图、索引视图、分区视图、系统视图
四、视图的基本操作
1.定义视图
CREATE VIEW <视图名> [(<列名1>…)]
AS <子查询>
[WITH CHECK OPTION]
- 列名可以全部省略或全部指定
- 子查询可以是任意的SELECT 语句,不允许使用DISTINCT短语和ORDER BY 子句,如果需要排序可以在视图定义之后再排序。
- WITH CHECK OPTION 的意思是对视图进行UPDATE/INSERT和DELETE操作时要保证操作的行满足子查询中的条件表达式。
CREATE VIEW 视图1 AS
SELECT 学号,姓名,性别
FROM STUDENT
WHERE 性别 = '女'
WITH CHECK OPTION
以上代码建立了一个名为视图1的视图,,体现了STUDENT表中学生的学号、姓名、性别,并且保证了进行修改和插入操作时仍保持视图中只有性别为女的学生。
2.视图重命名
注意:实际应用中,重命名视图,则依赖于该视图的代码和应用程序可能会出错。
SP_RENAME old_name, new_name
3.修改视图
ALTER <视图名>
AS 子查询
ALTER VIEW 视图1 AS
SELECT 学号,姓名,性别
FROM STUDENT
WHERE 性别 = '男' #将视图修改为性别为男的学生
WITH CHECK OPTION
4.视图的查询
基本知识:视图定义好之后,就可以像基本表一样进行查询。查询视图时,先进行有效性检查,检查查询中涉及的表、视图是否存在;然后从数据字典中取出视图的定义,把定义的子查询和用户查询结合起来,转换成等价的对基本表的查询;最后再执行修正了的查询。这就是视图消解的过程。
(就是下面这个意思)
SELECT 学号, 姓名
FROM 视图1
WHERE 姓名 LIKE '%一%' /**在视图1中查询姓名中包含一的学生的姓名和学号**/
视图消解后,转换的实际查询为
SELECT 学号, 姓名
FROM STUDENT /**因为视图1是定义在STUDENT表上的**/
WHERE 姓名 LIKE '%一%'
5.视图更新
UPDATE <视图名>
SET 列名 = ‘值’
WHERE 条件表达式
INSERT INTO <视图名>
VALUES( )
- 同表的操作相同,只是把表名改成视图名即可。
- 由两个以上的基本表导出的视图不允许更新。
- 若视图的属性来自聚集函数,那么此视图不允许更新。
- 有些更新视图操作不能直接转化为对基本表的更新操作。
- 一个不允许更新的视图上定义的视图也不允许更新。
6.视图删除
DROP VIEW <视图名>
同数据表的删除一样,有RESTRICT和CASCADE的区分。
DROP VIEW 视图1