基础篇
第1章 绪论
1.1 数据库系统概述
1.1.1 数据库的4个基本概念
1、数据(Data):描述事物的符号记录
数据的含义称为数据的语义,数据与其语义是不可分的。
2、数据库(Database):长期储存在计算机内、有组织的、可共享的大量数据的集合。
数据库中的数据按一定的数据模型组织、描述和储存,具有较小的冗杂度、较高的数据独立性和易扩展性,并可为各种用户共享。
3、数据库管理系统(DBMS):位于用户与操作系统之间的一层数据管理软件。
4、数据库系统(DBS):由数据库、数据库管理系统(及其应用开发工具)、应用程序和数据库管理员组成的存储、管理、处理和维护数据的系统。
1.1.2 数据管理技术的产生和发展
1、数据管理技术的发展过程
• 人工管理阶段(20世纪50年代中之前)
• 文件系统阶段(20世纪50年代末--60年代中)
• 数据库系统阶段(20世纪60年代末--现在)
2、数据库系统和文件系统的区别
• 文件系统
– 内部有结构,记录之间无关联
– 最小访问单位是记录
• 数据库系统
– 内部有结构,记录之间有关联
– 最小访问单位是数据项
1.2 数据模型
1.2.5 层次模型
![](https://i-blog.csdnimg.cn/blog_migrate/310cb8438ca00b1c4996ff853d4a2133.png)
一个层次模型的示例
1、在数据库中定义满足下面两个条件的基本层次联系的集合为层次模型:
(1)有且只有一个结点没有双亲结点,这个结点称为根节点;
(2)根以外的其他结点有且只有一个双亲结点。
2、层次模型的特征:
(1)结点的双亲是唯一的
(2)只能直接处理一对多的实体联系
(3)每个记录类型可以定义一个排序字段,也称为码字段
(4)任何记录值只有按其路径查看时,才能显出它的全部意义
(5)没有一个子女记录值能够脱离双亲记录值而独立存在
3、层次模型的优缺点:
• 优点
– 结构简单清晰
– 查询效率高
– 良好的完整性支持
• 缺点
– 很多联系是非层次性的
– m:n不好表示
– 查询子女必须通过双亲
– 层次命令趋向程序化
1.2.6 网状模型
1、网状模型的数据结构
网状模型中子女结点与双亲结点的联系可以不唯一,要为每个联系命名,并指出与该联系有关的双亲记录和子女记录。
![](https://i-blog.csdnimg.cn/blog_migrate/82a6ede240e85d3c7a7e34a11069a852.png)
2、网状模型的优缺点:
• 优点
– 能更直接地描述现实世界
– 访问效率高
• 缺点
– 结构复杂
– DDL DML复杂
– 路径联系记录
1.2.7 关系模型
1、关系模型的数据结构
在用户观点下,关系模型中数据的逻辑结构是一张二维表,它由行和列组成。
![](https://i-blog.csdnimg.cn/blog_migrate/541b9ce9b1dd477a000a9eb6025f3fb6.png)
2、关系模型的优缺点:
• 优点
– 以严格的数学概念为基础
– 结构单一(表格)
– 存取路径隐藏
• 缺点
– 查询效率不如非关系模型
1.3 数据库系统的结构
1.3.2 数据库系统的三级模式结构
![](https://i-blog.csdnimg.cn/blog_migrate/c61ecf3aa5db17f0a8d48a69ebb90be3.png)
数据库系统的三级模式结构
1、模式(Schema):也称逻辑模式,是数据库中全体数据的逻辑结构和特征的表述,是所有用户的公共数据视图。
2、外模式(External Schema):也称子模式或用户模式,它是数据库用户能够看见和使用的局部数据的逻辑结构和特征的描述,是数据库用户的数据视图,是与某一应用有关的数据的逻辑表示。
3、内模式(Internal Schema) :也称存储模式,一个数据库只有一个内模式。它是数据物理结构和存储方式的描述,是数据在数据库内部的组织方式。
1.3.3 二级映像功能与数据独立性
1、外模式/模式映像
• 保证数据的逻辑独立性
-当模式改变时,数据库管理员对外模式/模式映象作相应改变,使外模式保持不变
-应用程序是依据数据的外模式编写的,应用程序不必修改,保证了数据与程序的逻辑独立性,简称数据的逻辑独立性
2、模式/内模式映像
• 保证数据的物理独立性
-当数据库的存储结构改变了(例如选用了另一种存储结构),数据库管理员修改模式/内模式映象,使模式保持不变。
-应用程序不受影响。保证了数据与程序的物理独立性,简称数据的物理独立性。
• 特定的应用程序是在外模式描述的数据结构上编制的,它依赖于特定的外模式,与数据库的模式和存储结构独立。
• 不同的应用程序有时可以共用一个外模式
• 数据库的二级映像保证了数据库外模式的稳定性,从而从底层保证了应用程序的稳定性
章节试题
第2章 关系数据库
2.1 关系数据结构及形式化定义
2.1.1 关系
1、域:域是一组具有相同数据类型的值的集合
2、笛卡尔积(Cartesian Product)
![](https://i-blog.csdnimg.cn/blog_migrate/3f28ba3ee11eaff944044a709ffeb41b.png)
• 一个域允许的不同取值个数称为这个域的基数
章节试题
第二章:关系数据库_hellenionia的博客-CSDN博客
第3章 关系数据库标准语言SQL
3.1 SQL概述
3.1.2 SQL特点
(1)综合统一
(2)高度非过程化
(3)面向集合的操作方式
(4)以同一种语法结构提供多种使用方式
(5)语言简洁,易学易用
3.3 数据定义
3.3.2 基本表的定义、删除与修改
1、数据类型
![](https://i-blog.csdnimg.cn/blog_migrate/061e1cd7f65f08e4b5b7cf421b3c68f0.png)
2、oracle数据类型varchar2和sql的varchar区别
(1)varchar是标准sql里面的,varchar2是oracle提供的独有的数据类型。oracle保证任何版本的数据varchar2向上下兼容,但varchar不保证兼容。
(2)varchar对于汉字占两个字节,对于英文是一个字节,占的内存小,varchar2都是占两个字节。
(3)varchar对空串不处理,varchar2将空串当做null来处理。
(4)varchar存放固定长度的字符串,最大长度是2000,varchar2是存放可变长度的字符串,最大长度是4000
3.4 数据查询
3.4.1 单表查询
• 查询仅涉及一个表:
1、选择表中的若干列
2、选择表中的若干元组
(1)字符匹配
-匹配串为含通配符的字符串
[例3.30] 查询所有姓刘学生的姓名、学号和性别。
SELECT Sname, Sno, Ssex
FROM Student
WHERE Sname LIKE '刘%';
[例3.31] 查询姓"欧阳"且全名为三个汉字的学生的姓名。
SELECT Sname
FROM Student
WHERE Sname LIKE '欧阳__';
-使用换码字符将通配符转义为普通字符
[例3.34] 查询DB_Design课程的课程号和学分。
SELECT Cno,Ccredit
FROM Course
WHERE Cname LIKE 'DB\_Design' ESCAPE '\' ;
[例3.35] 查询以"DB_"开头,且倒数第3个字符为 i的课程的详细情况。
SELECT *
FROM Course
WHERE Cname LIKE 'DB\_%i_ _' ESCAPE '\' ;
-ESCAPE '\' 表示将字符串中“ \” 后的第一个字符转义为普通字符
3、ORDER BY子句
4、聚集函数
5、GROUP BY子句
3.4.2 连接查询
1、等值与非等值连接查询
2、自身连接
3、外连接
4、多表连接
3.4.3 嵌套查询
1、带有IN谓词的子查询
2、带有比较运算符的子查询
3、带有ANY(SOME)或ALL谓词的子查询
4、带有EXISTS谓词的子查询
3.4.4 集合查询
• 集合操作的种类
-并操作UNION
-交操作INTERSECT
-差操作MINUS
• 参加集合操作的各查询结果的列数必须相同;对应项的数据类型也必须相同
3.4.6 SELECT语句的一般格式
SELECT [ALL|DISTINCT]
<目标列表达式> [别名] [ ,<目标列表达式> [别名]] …
FROM <表名或视图名> [别名]
[ ,<表名或视图名> [别名]] …
|(<SELECT语句>)[AS]<别名>
[WHERE <条件表达式>]
[GROUP BY <列名1>[HAVING<条件表达式>]]
[ORDER BY <列名2> [ASC|DESC]];
3.5 数据更新
3.5.1 插入数据
1、插入元组
(1)语句格式
INSERT
INTO <表名> [(<属性列1>[,<属性列2 >…)]
VALUES (<常量1> [,<常量2>]… );
(2)功能
-将新元组插入指定表中
3.5.2 修改数据
1、语句格式
UPDATE <表名>
SET <列名>=<表达式>[,<列名>=<表达式>]…
[WHERE <条件>];
2、功能
(1)修改指定表中满足WHERE子句条件的元组
(2)SET子句给出<表达式>的值用于取代相应的属性列
(3)如果省略WHERE子句,表示要修改表中的所有元组
3.5.3 删除数据
1、语句格式
DELETE
FROM <表名>
[WHERE <条件>];
2、功能
• 删除指定表中满足WHERE子句条件的元组
3、WHERE子句
(1)指定要删除的元组
(2)缺省表示要删除表中的全部元组,表的定义仍在数据字典中
3.7 视图
3.7.1 定义视图
1、建立视图
语句格式
CREATE VIEW <视图名> [(<列名> [,<列名>]…)]
AS <子查询>
[WITH CHECK OPTION];
3.7.3 更新视图
1、ORACLE对视图更新的限制:
(1)子查询中有多表连接、分组、聚集的内容都不能更新。
(2)虚拟列的值不能更新。
3.7.4 视图的作用
(1)视图能够简化用户的操作
(2)视图使用户能以多种角度看待同一数据
(3)视图对重构数据库提供了一定程度的逻辑独立性
(4)视图能够对机密数据提供安全保护
(5)适当的利用视图可以更清晰的表达查询
章节试题
第三章:关系数据库标准语言SQL_hellenionia的博客-CSDN博客
第4章 数据库安全性
4.1 数据库安全性概述
4.1.2 安全标准简介
1、TCSEC/TDI安全级别划分
![](https://i-blog.csdnimg.cn/blog_migrate/29e3ca0911692770b4e687751593b304.png)
2、 CC评估保证级(EAL)划分
![](https://i-blog.csdnimg.cn/blog_migrate/630605d38583a1069303bf167e8f1fad.png)
4.2 数据库安全性控制
4.2.4 授权:授予与收回
1、ORACLE中GRANT语句的一般格式:
GRANT <对象权限>[,<对象权限>]...
ON <对象名>[,<对象名>]…
TO <用户>[,<角色>]...;
[WITH GRANT OPTION]
GRANT <系统权限>[,<系统权限>]...
TO <用户>[,<角色>]...;
[WITH ADMIN OPTION]
GRANT <角色>[,<角色>]...
TO <用户>[,<用户>]...;
2、REVOKE权限回收
REVOKE ... FROM <用户>[,<角色>]…
• 将授权时的grant替换为revoke
• 将授权时的to替换为from
4.2.5 数据库角色
1、角色的创建
CREATE ROLE <角色名>
4.2.6 强制存取控制方法
1、敏感度标记(Label)
(1)对于主体和客体,DBMS为它们每个实例(值)指派一个敏感度标记(Label)
(2)敏感度标记分成若干级别
• 绝密(Top Secret,TS)
• 机密(Secret,S)
• 可信(Confidential,C)
• 公开(Public,P)
• TS>=S>=C>=P
(3)主体的敏感度标记称为许可证级别(Clearance Level)
(4)客体的敏感度标记称为密级(Classification Level)
2、强制存取控制规则
(1)仅当主体的许可证级别大于或等于客体的密级时,该主体才能读取相应的客体
(2)仅当主体的许可证级别小于或等于客体的密级时,该主体才能写相应的客体
4.4 审计
1、AUDIT语句和NOAUDIT语句
[例4.15] 对修改SC表结构或修改SC表数据的操作进行审计
AUDIT ALTER,UPDATE
ON SC;
[例4.16] 取消对SC表的一切审计
NOAUDIT ALTER,UPDATE
ON SC;
4.6 其他安全性保护
1、推理控制:
(1)强制存取控制未解决的问题
(2)避免用户利用其能够访问的数据推知更高密级的数据
2、隐蔽信道:
• 强制存取控制未解决的问题
3、数据隐私保护:
• 控制不愿被他人知道或他人不便知道的个人数据的能力
章节试题
第四章:数据库安全性_hellenionia的博客-CSDN博客
第5章 数据库完整性
5.3 用户定义的完整性
5.3.1 属性上的约束条件
1、属性上约束条件的定义
(1)不允许取空值
(2)列值唯一
(3)用CHECK短语制定列值应该满足的条件
[例5.8] SC表的Grade的值应该在0和100之间
CREATE TABLE SC
( Sno CHAR(9) ,
Cno CHAR(4) UNIQUE NOT NULL,
Grade SMALLINT CHECK (Grade>=0 AND Grade <=100), /*Grade取值范围是0到100*/
PRIMARY KEY (Sno,Cno),
FOREIGN KEY (Sno) REFERENCES Student(Sno),
FOREIGN KEY (Cno) REFERENCES Course(Cno)
);
5.7 触发器
5.7.1 定义触发器
ORALCE数据库表事件触发器一般格式:
CREATE TRIGGER 触发器名
AFTER|BEFORE
INSERT OR UPDATE OR DELETE
{OF 属性名}
ON 触发表名
{FOR EACH ROW } --行级触发器语句,没有则为语句级触发器
[declare 自定义变量]
BEGIN
过程化sql
END;
• 修改前的元组属性值:OLD.属性名
• 修改后的元组属性值:NEW.属性名
章节试题
第五章:数据完整性_hellenionia的博客-CSDN博客
设计与应用开发篇
第6章 关系数据理论
6.2 规范化
6.2.9 规范化小结
![](https://i-blog.csdnimg.cn/blog_migrate/cf48c3708f6d3db6a9cb461f8deddb9e.png)
6.3 数据依赖的公理系统
1、F={AC→B, C→BD}最小函数依赖的函数决定集为主码,主码为?
(1)最小依赖计算过程:
• 第一个函数依赖AC→B
• AC→B不能由剩余的函数依赖{C→BD}导出
![](https://i-blog.csdnimg.cn/blog_migrate/4275d5295be096af9b8874396a18baba.png)
• {AC→B}分解为{A→B,C→B},其中{C→B}能够由{C→BD}导出,{C→B}为冗余函数依赖
• F={A→B,C→BD}
(2)F={AC→B, C→BD}
• 第二个函数依赖C→BD,分解为C→B,C→D
• C→B不能由剩余的函数依赖导出
• C为单属性,没有冗余。{C→B}极小处理后为{C→B}
• C→D不能由剩余的函数依赖导出
• C为单属性,没有冗余。{C→D}极小处理后为{C→D}
• F={A→B,C→B, C→D}
• 最小函数依赖决定集为AC
章节试题
第六章:关系数据理论_hellenionia的博客-CSDN博客
第7章 数据库设计
7.1 数据库设计概述
7.1.3 数据库设计的基本步骤
1、数据库的设计过程:
(1)需求分析:综合各个用户的应用需求(现实世界的需求),完成数据字典。
(2)概念结构设计:概念模式(信息世界模型),用E-R图来描述。
(3)逻辑结构设计:逻辑模式、外模式。
(4)物理结构设计:内模式。
(5)数据库实施:数据载入、试运行
(6)数据库运行维护
• 设计过程中往往还会有许多反复
7.3 概念结构设计
7.3.2 E-R模型
1、实体之间的联系
(1)两个实体型之间的联系
![](https://i-blog.csdnimg.cn/blog_migrate/667df6d0f64c54875d09f7956b0e61e8.png)
(2)两个以上的实体型之间的联系
(3)单个实体型内的联系
7.4 逻辑结构设计
7.4.1 E-R图向关系模型的转换
1、转换原则:
(1)一个实体型转换为一个关系模式。
• 关系模式的属性:实体的属性
• 关系模式的码:实体的码
2、实体型间的联系有以下不同情况:
(1)一个1:1联系可以转换为一个独立的关系模式,也可以与任意一端对应的关系模式合并。
① 转换为一个独立的关系模式
• 关系的属性:与该联系相连的各实体的码以及联系本身的属性
• 关系的候选码:每个实体的码均是该关系的候选码
![](https://i-blog.csdnimg.cn/blog_migrate/7529e0c266187984bbbe402737023c0d.png)
②与某一端实体对应的关系模式合并
• 合并后关系的属性:加入对应关系的码和联系本身的属性
• 合并后关系的码:不变
![](https://i-blog.csdnimg.cn/blog_migrate/9e5626cfd6c76c0cd6b6ca8ccaf7ef40.png)
(2)一个1:n联系可以转换为一个独立的关系模式,也可以与n端对应的关系模式合并。
①转换为一个独立的关系模式
• 关系的属性:与该联系相连的各实体的码以及联系本身的属性
• 关系的码:n端实体的码
![](https://i-blog.csdnimg.cn/blog_migrate/4c7daa06c51b1a08bf2898b373b71215.png)
②与n端对应的关系模式合并
• 合并后关系的属性:在n端关系中加入1端关系的码和联系本身的属性
• 合并后关系的码:不变
• 可以减少系统中的关系个数,一般情况下更倾向于采用这种方法
![](https://i-blog.csdnimg.cn/blog_migrate/a8d7fdc2f5614b510b65eaaa76a7b298.png)
(3)一个m:n联系转换为一个关系模式
• 关系的属性:与该联系相连的各实体的码以及联系本身的属性
• 关系的码:各实体码的组合
[例]“选修”联系是一个m:n联系,可以将它转换为如下关系模式,其中学号与课程号为关系的组合码:
选修(学号,课程号,成绩)
(4)三个或三个以上实体间的一个多元联系转换为一个关系模式。
• 关系的属性:与该多元联系相连的各实体的码以及联系本身的属性
• 关系的码:各实体码的组合
7.5 物理结构设计
7.5.2 关系模式存取方法选择
物理结构设计的任务之一是根据关系数据库管理系统支持的存取方法确定选择哪些存取方法。
数据库管理系统常用存取方法:B+树索引和hash索引
1、B+树索引存取方法的选择
2、Hash索引存取方法的选择
• B+树索引和Hash索引的区别
(1)Hash索引不能进行范围查询,而B+树可以。
这是因为Hash索引指向的数据是无序的,而B+ 树的叶子节点是个有序的链表。
(2)Hash索引不支持联合索引的最左侧原则(即联合索引的部分索引无法使用),而B+树可以。
对于联合索引来说,Hash索引在计算Hash值的时候是将索引键合并后再一起计算Hash值,所以不会针对每个索引单独计算Hash值。因此如果用到联合索引的一个或多个索引时,联合索引无法被利用。
(3)Hash索引不支持Order BY排序,而B+树支持。
因为Hash索引指向的数据是无序的,因此无法起到排序优化的作用,而B+树索引数据是有序的,可以起到对该字段Order By 排序优化的作用。
(4)Hash索引无法进行模糊查询,而B+ 树支持。
而B+ 树使用 LIKE 进行模糊查询的时候,LIKE后面前模糊查询(比如%开头)的话可以起到优化的作用。
(5)Hash索引在等值查询和比较查询上比B+树效率更高
聚簇存取方法的选择
(1)什么是聚簇
• 为了提高某个属性(或属性组)的查询速度,把这个或这些属性(称为聚簇码)上具有相同值的元组集中存放在连续的物理块中称为聚簇,也称为聚簇存放。
• 该属性(或属性组)称为聚簇码(cluster key)
• 许多关系型数据库管理系统都提供了聚簇功能
• ORACLE数据库支持上述3中存取方法
章节试题
第七章:数据库设计_hellenionia的博客-CSDN博客
第8章 数据库编程
8.1 嵌入式SQL
8.1.2 嵌入式 SQL语句与主语言之间的通信
1、主变量
(1)在SQL语句之外(主语言语句中)使用主变量和指示变量的方法
• 可以直接引用,不必加冒号
(2)在SQL语句中使用主变量和指示变量的方法
• 加冒号
8.2 过程化SQL
8.2.1 过程化SQL的块结构
1、过程化SQL块的基本结构
(1)定义部分
DECLARE 变量、常量、游标、异常等
• 定义的变量、常量等只能在该基本块中使用
• 当基本块执行结束时,定义就不再存在
2、执行部分
BEGIN
SQL语句、过程化SQL的流程控制语句
EXCEPTION
异常处理部分
END;
8.2.3 流程控制
1、条件控制语句
• IF-THEN,IF-THEN-ELSE和嵌套的IF语句
(1)IF语句
IF condition THEN
Sequence_of_statements;
END IF;
(2)IF-THEN语句
IF condition THEN
Sequence_of_statements1;
ELSE
Sequence_of_statements2;
END IF;
(3)在THEN和ELSE子句中还可以再包含IF语句,即IF语句可以嵌套
2、循环控制语句
• LOOP,WHILE-LOOP和FOR-LOOP
(1)简单的循环语句LOOP
LOOP
Sequence_of_statements;
END LOOP;
• 多数数据库服务器的过程化SQL都提供EXIT、BREAK或LEAVE等循环结束语句,保证LOOP语句块能够结束
(2)WHILE-LOOP(常用循环)
WHILE condition LOOP
Sequence_of_statements;
END LOOP;
• 每次执行循环体语句之前,首先对条件进行求值
• 如果条件为真,则执行循环体内的语句序列
• 如果条件为假,则跳过循环并把控制传递给下一个语句
(3)FOR-LOOP
FOR count IN [REVERSE] bound1 … bound2 LOOP
Sequence_of_statements;
END LOOP;
[例如]:
FOR i IN 1 … 7 LOOP
insert into test values i;
END LOOP;
3、错误处理
• 如果过程化SQL在执行时出现异常,则应该让程序在产生异常的语句处停下来,根据异常的类型去执行异常处理语句
• SQL标准对数据库服务器提供什么样的异常处理做出了建议,要求过程化SQL管理器提供完善的异常处理机制
• ORACLE数据库用exception when others then跳转到异常处理
8.3 存储过程和函数
8.3.1 存储过程
1、存储过程的用户接口
(1)创建存储过程
CREATE OR REPLACE PROCEDURE 过程名[(参数1,参数2,...)]
AS <过程化SQL块>;
• 过程名:数据库服务器合法的对象标识
• 参数列表:用名字来标识调用时给出的参数值,必须指定值的数据类型。参数也可以定义输入参数、输出参数或输入/输出参数,默认为输入参数 (ORACLE中 A in varchar2 B out varchar2)
• 过程体:是一个<过程化SQL块>,包括声明部分和可执行语句部分
• ORACLE中,AS可以用IS代替
8.3.2 函数
1、函数和存储过程的异同
• 同:都是持久性存储模块
• 异:函数必须指定返回的类型
2、函数的定义语句格式
CREATE OR REPLACE FUNCTION 函数名 ([参数1,参数2,…]) RETURNS <类型>
AS <过程化SQL块>;
3、函数的执行语句格式
CALL/SELECT 函数名 ([参数1,参数2,…]);
4、修改函数
(1)重命名
ALTER FUNCTION 过程名1 RENAME TO 过程名2;
(2)重新编译
ALTER FUNCTION 过程名 COMPILE;
(3)删除对象
DROP <对象类型> <对象名>
[例]
DROP TABLE A;
DROP VIEW A;
DROP TRIGGER A;
DROP PROCEDURE A;
DROP FUNCTION A;
8.3.3 过程化SQL中的游标
1、游标使用示例
CREATE OR REPLACE PROCEDURE proc_temp(item_code varchar2) IS
CURSOR c_temp_gk_yb IS
SELECT * FROM cj.temp_gk_1
WHERE 项目代码 = item_code;
ROW_NR c_temp_gk_yb%ROWTYPE;
l_item_coee VARCHAR2(30);
BEGIN
OPEN c_temp_gk_yb;
FETCH c_temp_gk_yb
INTO ROW_NR;
WHILE c_temp_gk_yb%FOUND LOOP
--游标循环内容开始
SELECT item_code INTO l_item_coee FROM current_price_list
WHERE 'Z'||item_name = ROW_NR.项目名称;
UPDATE clinic_vs_charge
SET charge_item_code = l_item_coee
WHERE charge_item_code = ROW_NR.项目代码;
--游标循环内容结束
FETCH c_temp_gk_yb
INTO ROW_NR;
END LOOP;
CLOSE c_temp_gk_yb;
exception when others THEN
V_MSG :=SQLERRM;
insert into proc_log(err_log) values (V_MSG);
COMMIT;
END;
8.7 小结
1、以下内容都能实现应用程序与数据库的数据交互
• 嵌入式SQL
• ODBC编程
• JDBC编程
章节试题
第八章:数据库编程_编程数据库_hellenionia的博客-CSDN博客
系统篇
第9章 关系查询处理和查询优化
9.1 关系数据库系统的查询处理
9.1.1 查询处理步骤
![](https://i-blog.csdnimg.cn/blog_migrate/2856a79cd928282bd6d5cb3c820fc10e.png)
9.3 代数优化
9.3.2 查询树的启发式优化
1、典型的启发式规则
(1)选择运算应尽可能先做
• 在优化策略中这是最重要、最基本的一条。
(2)把投影运算和选择运算同时进行
• 如有若干投影和选择运算,并且它们都对同一个关系操作,则可以在扫描此关系的同时完成所有的这些运算以避免重复扫描关系。
(3) 把投影同其前或其后的双目运算结合起来,没有必要为了去掉某些字段而扫描一遍关系。
(4) 把某些选择同在它前面要执行的笛卡尔积结合起来成为一个连接运算,连接特别是等值连接运算要比同样关系上的笛卡尔积省很多时间。
(5) 找出公共子表达式
• 如果这种重复出现的子表达式的结果不是很大的关系
• 并且从外存中读入这个关系比计算该子表达式的时间少得多
• 则先计算一次公共子表达式并把结果写入中间文件是合算的。
• 当查询的是视图时,定义视图的表达式就是公共子表达式的情况
9.4 物理优化
9.4.1基于启发式规则的存取路径选择优化
1、选择操作的启发式规则
• 对于小关系,使用全表顺序扫描,即使选择列上有索引
• 对于大关系,启发式规则有:
(1)对于选择条件是“主码=值”的查询
• 查询结果最多是一个元组,可以选择主码索引
• 一般的关系数据库管理系统会自动建立主码索引
(2)对于选择条件是“非主属性=值”的查询,并且选择列上有索引
• 要估算查询结果的元组数目
• 如果比例较小(<10%)可以使用索引扫描方法
• 否则还是使用全表顺序扫描
(3)对于选择条件是属性上的非等值查询或者范围查询,并且选择列上有索引
• 要估算查询结果的元组数目
• 如果比例较小(<10%)可以使用索引扫描方法
• 否则还是使用全表顺序扫描
(4)对于用AND连接的合取选择条件
• 如果有涉及这些属性的组合索引
-优先采用组合索引扫描方法
• 如果某些属性上有一般的索引,可以用索引扫描方法
• 其他情况:使用全表顺序扫描
(5)对于用OR连接的析取选择条件,一般使用全表顺序扫描
2、连接操作的启发式规则
(1)如果2个表都已经按照连接属性排序
• 选用排序-合并算法
(2)如果一个表在连接属性上有索引
• 选用索引连接算法
(3)如果上面2个规则都不适用,其中一个表较小
• 选用Hash join算法
(4)可以选用嵌套循环方法,并选择其中较小的表,确切地讲是占用的块数(b)较少的表,作为外表(外循环的表) 。
理由:
• 设连接表R与S分别占用的块数为Br与Bs
• 连接操作使用的内存缓冲区块数为K
• 分配K-1块给外表
• 如果R为外表,则嵌套循环法存取的块数为Br+BrBs/(K-1)
• 显然应该选块数小的表作为外表
章节试题
第九章:关系数据库查询处理和查询优化_hellenionia的博客-CSDN博客
第10章 数据库恢复技术
10.1 事务的基本概念
1、事务的ACID特性:
• 原子性(Atomicity)
• 一致性(Consistency)
• 隔离性(Isolation)
• 持续性(Durability )
10.3 故障种类
1、事务内部的故障
• 事务内部更多的故障时非预期的,是不能由应用程序处理的
• 事务故障仅指这类非预期的故障
• 事务撤销:在不影响其他事务运行的情况下,强行回滚该事务,即撤销该事务已经作出的任何对数据库的修改,使得该事务好像根本没有启动一样。
2、系统故障:造成系统停止运转的任何事件,使得系统要重新启动。
3、介质故障
4、计算机病毒
10.5 恢复策略
10.5.1 事务故障的恢复
1、事务故障:事务在运行至正常终止点前被终止
2、恢复方法
• 由恢复子系统利用日志文件撤消(UNDO)此事务已对数据库进行的修改
3、事务故障的恢复由系统自动完成,对用户是透明的,不需要用户干预
10.5.2 系统故障的恢复
1、系统故障造成数据库不一致状态的原因
• 未完成事务对数据库的更新可能已写入数据库
• 已提交事务对数据库的更新可能还留在缓冲区没来得及写入数据库
2、恢复方法
• Undo 故障发生时未完成的事务
• Redo 已完成的事务
3、系统故障的恢复由系统在重新启动时自动完成,不需要用户干预
10.5.3 介质故障的恢复
1、重装数据库
2、重做已完成的事务
10.6 利用检查点的恢复技术
1、系统出现故障时,恢复子系统将根据事务的不同状态采取不同的恢复策略
![](https://i-blog.csdnimg.cn/blog_migrate/2fbca02db7b37d18576a9bd06387a44e.png)
2、利用检查点的恢复步骤:
(1)从重新开始文件中找到最后一个检查点记录在日志文件中的地址,由该地址在日志文件中找到最后一个检查点记录
(2)由该检查点记录得到检查点建立时刻所有正在执行的事务清单ACTIVE-LIST
• 建立两个事务队列
-UNDO-LIST
-REDO-LIST
• 把ACTIVE-LIST暂时放入UNDO-LIST队列,REDO队列暂为空。
(3)从检查点开始正向扫描日志文件,直到日志文件结束
• 如有新开始的事务Ti,把Ti暂时放入UNDO-LIST队列
• 如有提交的事务Tj,把Tj从UNDO-LIST队列移到REDO-LIST队列;直到日志文件结束
(4)对UNDO-LIST中的每个事务执行UNDO操作
对REDO-LIST中的每个事务执行REDO操作
章节试题
第十章:数据库恢复技术_hellenionia的博客-CSDN博客
第11章 并发控制
11.1 并发控制概述
1、数据库的并发控制以事务为单位
2、数据库的并发控制通常使用封锁机制
• 基本封锁
• 多粒度封锁
11.2 封锁
1、锁的相容矩阵
![](https://i-blog.csdnimg.cn/blog_migrate/6e3d4b539282877f4fc7e7bdaf97ac3b.png)
11.3 封锁协议
1、一级封锁协议
2、二级封锁协议
3、三级封锁协议
![](https://i-blog.csdnimg.cn/blog_migrate/d80961a43f5d0d6d4ee61eb6f40c8d2d.png)
4、三级协议的主要区别
• 什么操作需要申请封锁以及何时释放锁(即持锁时间)
5、不同的封锁协议使事务达到的一致性级别不同
• 封锁协议级别越高,一致性程度越高
11.4 活锁和死锁
11.4.1 活锁
1、避免活锁的方法:先来先服务策略
11.4.2 死锁
1、死锁的预防
2、死锁的诊断与解除
11.5 并发调度的可串行性
1、并发事务调度的正确性
• 可串行性
-并发操作的正确性则通常由两段锁协议来保证。
-两段锁协议是可串行化调度的充分条件,但不是必要条件
• 冲突可串行性
11.7 封锁的粒度
11.7.2 意向锁
1、常用意向锁
• 意向共享锁(Intent Share Lock,简称IS锁)
• 意向排它锁(Intent Exclusive Lock,简称IX锁)
• 共享意向排它锁(Share Intent Exclusive Lock,简称SIX锁)
章节试题
第十一章:并发控制_hellenionia的博客-CSDN博客