OUC中国海洋大学23数据库系统期末复习

图片加载不出来需要挂梯子

第一章 绪论

基本定义

数据

数据是数据库中存储的基本对象。数据是描述事物的符号记录

数据和语义是不可分的

数据库

数据库是长期储存在计算机内、有组织可共享大量数据集合

数据模型三要素

数据结构,数据操作,完整性约束

数据库领域常用逻辑模型

image-20260116122909654

概念模型(E-R图)

image-20260116123737950

什么是数据库系统三级模式结构?优点?

三级模式结构(大概率考)

image-20251216103240728

模式:全体数据的逻辑结构和特征的描述。是一个中间层

内模式:是数据物理结构和存储方式的描述,是数据在数据库内部的表示方式。我们在第九章详细讲了这个。

外模式:两个一对多。外模式是数据库用户使用的局部数据的逻辑结构和特征的描述;同一外模式也可以为某一用户的多个应用系统所使用

二级映像

三个抽象级别的联系和转换

外模式/模式映像
  • 保证数据的逻辑独立性

一个数据库可以有多个外模式。反映了不同用户的应用需求,看待数据的方式,对数据保密的要求

逻辑独立性

模式改变时,数据库管理员修改有关的外模式/模式映像,使外模式保持不变

应用程序是依据数据的外模式编写的,从而应用程序不必修改,保证了数据与程序的逻辑独立性,简称数据的逻辑独立性。

模式/内模式映像
  • 保证数据的物理独立性

数据库中该映像是唯一的。

物理独立性

数据库的存储结构改变了(例如选用了另一种存储结构),数据库管理员修改模式/内模式映像,使模式保持不变

应用程序不受影响,保证了数据与程序的物理独立性

第二章 关系数据库

基本概念

域:具有相同数据类型的值的集合

笛卡尔积:所有域的所有取值的组合

元组:笛卡尔积中的每一个元素

分量;笛卡尔积元素中的每个值

关系

关系是笛卡尔积的子集。关系中的每个元素是关系中的元组。

关系的表示

关系是一个二维表,表的每行对应一个元组,每列对应一个。为了区分不同的域,我们取一个名字为属性

不同的码

候选码

关系中的某一属性组(一类属性)能够决定其他元组,就称该属性组为候选码

设K为R<U,F>中的属性或属性组合,若U完全依赖于K,则称K为R的候选码

全码

关系中所有属性组是这个关系模式的候选码,称为全码

例子:

关系模式R(P,W,A)
P:演奏者 W:作品 A:听众
1. 一个演奏者可以演奏多个作品
2. 某一作品可被多个演奏者演奏
3. 听众可以欣赏不同演奏者的不同作品

主码

从多个候选码选一个出来,称为主码

外部码

F是基本关系R的一个或一组属性,但不是关系R的码。如果F与基本关系S的主码Ks相对应,则称F是基本关系R的外码。其中基本关系R称为参照关系,基本关系S称为被参照关系目标关系

主属性

包含在任何一个候选码中的属性,称为主属性。不包含在任何码中的属性称为非主属性或非码属性

关系代数(必考)

image-20260114095744784

笛卡尔积

R 和 S,R作为外层循环,有n条记录;S作为内层循环,有m条记录。二重循环后,最后得到一个n * m的结果。

选择

投影

连接

等值连接

自然连接

把等值连接中的重复列去掉

给定关系R (X,Y)S (Y,Z),其中XYZ为属性组。

R中的YS中的Y可以有不同的属性名,但必须出自相同的域集。

RS的除运算得到一个新的关系P(X)**

PR中满足下列条件的元组在 X 属性列上的投影:

image-20260116121259857
例子
image-20260114100632672

做题步骤

  1. 求的是什么属性:投影
  2. 满足什么限制条件:选择
  3. 从哪张表或哪几张表中查找:自然连接

第三章 关系数据库标准语言SQL

表层次的SQL语句

创建

修改

ALTER TABLE <表名>
	[ADD <新列名> <数据类型> [完整性约束]]
	[DROP <完整性约束名>]
	[ALTER COLUMN <列名> <数据类型>]

向Student表增加“入学时间”列,其数据类型为日期型。

ALTER TABLE Student ADD S_entrance DATE;

增加课程名称必须取唯一值的约束条件。

ALTER TABLE Course ADD UNIQUE(Cname); 

删除

DROP TABLE <表名> [RESTRICT | CASCADE]

记录层次的SQL语句

规则

不能破坏实体完整性、参照完整性以及用户定义的完整性。考虑下2NF(存在传递依赖)、3NF(存在)的插入异常

语法

INTO子句后面属性列的顺序可与表定义的顺序不一样。如果不写默认为表中定义的顺序。

但是VALUES子句中的提供的值必须和INTO子句匹配

INSERT
INTO <表名> [ (<属性列1> [, <属性列2>, ...)] ]
VALUES (<常量1> [, <常量2>] ... )

例子

将一个新学生元组(学号:200215128;姓名:陈冬;性别:男;所在系:IS;年龄:18岁)插入到Student表中。

INSERT
INTO  Student (Sno,Sname,Ssex,Sdept,Sage)
VALUES ('200215128','陈冬','男','IS',18);

对每一个系,求学生的平均年龄,并把结果存入数据库。

INSERT
INTO  Dept_age(Sdept,Avg_age)
    SELECT  Sdept,AVG(Sage)
    FROM  Student
    GROUP BY Sdept;

语法

where子句缺省表示要删除表中的全部元组,表的定义仍在字典中

如果删除操作破坏了数据库的完整性,将进行违约处理

DELETE
FROM <表名>
[WHERE <条件>];

删除计算机可学习所有学生的选课记录

DELETE
FROM SC
WHERE ’CS' = (
				SELECT Sdept
				FROM Student
				WHERE Student.sno = SC.sno
				);

RDBMS在执行修改语句时会检查修改操作。如果破坏了数据库的完整性,将进行违约处理

规则

语法

SET子句指定修改方式、要修改的列和修改后的取值

WHERE子句指定要修改的元组,缺省表示要修改表中所有元组

UPDATE <表名>
SET <列名> = <表达式> [, <列名>=<表达式> ]...
[WHERE <条件>];

将学生200215121的年龄改为22岁

UPDATE  Student
SET Sage=22
WHERE  Sno=' 200215121 '; 

将所有学生的年龄增加1岁

UPDATE Student
SET Sage= Sage+1;

将计算机科学系全体学生的成绩置零

UPDATE SC
    SET  Grade=0
    WHERE  'CS'=
           (SELECT Sdept
            FROM  Student
            WHERE  Student.Sno = SC.Sno);

这个单独写一篇

索引相关的SQL语句

建立索引

CREATE [UNIQUE] [CLUSTER] INDEX <索引名>
ON <表名> (<列名>[次序] ...);
  • UNIQUE:唯一索引

  • CLUSTER:聚簇索引

  • 次序

    • ASC:升序
    • DESC:降序
CREATE CLUSTER INDEX Stusname  ON  Student(Sname);
CREATE UNIQUE INDEX  SCno ON SC(Sno ASC,Cno DESC); 

删除索引

DROP INDEX <索引名>

视图相关的SQL语句

视图的定义

  • 是从一个或几个基本表导出的虚表
  • 只存放视图的定义,不存放视图对应的数据
  • 基表中的数据发生变化,从视图中查询出的数据也随之改变

建立视图

RDBMS执行CREATE VIEW语句时只是把视图定义存入数据字典,并不执行其中的SELECT语句。

数据字典是DBMS内部的一组系统表,记录了数据库中所有的定义信息。

CREATE VIEW <视图名> [ (<列名> [,<列名>]...) ]
AS <子查询>
[WITH CHECK OPTION];

WITH CHECK OPTION表示对视图进行 增删改 操作时要保证 增删改的行 满足 视图定义中的谓词条件。

建立信息系学生的视图,并要求进行修改和插入操作时仍需保证该视图只有信息系的学生 。

CREATE VIEW CS
AS
SELECT Sno, Sname, Sage
FROM Student
WHERE Sdept = 'CS'
WITH CHECK OPTION;

这样在对视图 CS 进行增删改的时候会自动加上 Sdept=’IS‘ 的条件

将Student表中所有女生记录定义为一个视图

CREATE VIEW F_Student(F_Sno,name,sex,age,dept)
AS
SELECT *
FROM  Student
WHERE Ssex=‘女’;

但这样Student表变了,视图也不能用了

更新视图

将信息系学生视图IS_Student中学号200215122的学生姓名改为“刘辰”

UPDATE  IS_Student
SET  Sname= '刘辰'
WHERE  Sno= ' 200215122 ';

会写sql查询语句,以及视图部分定义要牢记

基本表的定义 删除 修改 创建

重点:数据的查询

数据查询 数据定义 数据操作

d单表(排序 分组) 连接(等值) 嵌套(带in的子查询)

数据更新 插入 删除

索引的创建 要会创建索引 知道数据字典的概念

视图 什么是视图 如何创建视图

查询(给定条件) 新建 删除 修改 满足某种条件的 排序 统计 分组 视图创建 视图创建时的完整性

第四章 数据库安全性

能改概述如何维护数据库安全

数据库的安全控制常用的方法技术 自主存取控制(什么语句实现的 授权 撤销授权) 强制存取控制

审计 审计的概念 审计的分类(由谁来审计)

image-20260116125148943

最低要求是C2

用户标识和鉴定

用户提供口令,系统核对口令以鉴别用户身份

存取控制

主体、客体定义

  • 主体是系统中的活动实体
    • DBMS所管理的实际用户
    • 代表用户的各进程
  • 客体是系统中的被动实体,是受主体操纵的
    • 文件
    • 基表
    • 索引
    • 视图

自主存取控制(C2)

存取控制包括:定义用户权限、合法权限检查

定义存取权限称为 授权

优点

这是一种灵活的授权机制,DBA拥有所有对象的所有权限。

缺点

可能造成数据的无意泄露。因为这种机制仅仅通过数据的存取权限来进行安全控制,而数据本身并无安全性标记。也就是说只涉及主体,未涉及客体。

授予
GRANT <权限> [,<权限>]...
[ON <对象类型> <对象名>]
TO <用户> [,<用户>]...
[WITH GRANT OPTION]

WITH GRANT OPTION具有这样的特性:不允许循环授权

image-20260116125657985

ALL PRIVILEGES, PUBLIC了解一下

同时可以使用ROLE批量管理。 ROLE就好比是授权的视图

CREATE ROLE R1;

GRANT ...
ON...
TO R1;

GRANT R1
To ...

REVOKE R1
FROM ...
收回
REVOKE <权限> [,<权限>]...
[ON <对象类型> <对象名>]
FROM <用户> [,<用户>]... [RESTRICT | CASCADE];

默认是RESTRICT

强制存取控制(B1)

主体的敏感度标记称为许可证级别,课题的敏感度标记密级

  • 主体许可证级别 >= 客体密级:主体可以读客体
  • 主体许可证级别 = 客体密级:主体可以写客体

修正规则:主体 <= 客体:主体能写客体

视图机制

把要保密的数据对无权存取这些数据的用户隐藏起来,对数据提供一定程度的安全保护

主要功能是提供数据独立性,间接实现了支持存取谓词的用户权限定义

审计数据(C2以上必须有)

设置审计功能

AUDIT <权限>
ON <对象名>;

取消审计功能

NOAUDIT <权限>
ON <对象名>;

加密

推理控制、隐蔽信道、数据隐私保护

第五章 数据库完整性

数据库的完整性 实体完整性 参照完整性 定义理解 使用 重点

触发器 触发的事件 什么情况下会触发触发器

能区分数据库的完整性和数据库的安全性 以及他们分别保障了什么

用户定义的完整性

什么是数据库安全性?什么是完整性?

完整性

数据库的完整性指的是数据正确性相容性,防止不合语义的数据进入数据库。即:完整性代表是否能真实地反映现实世界。

安全性

而数据库的安全性指的是保护数据库防止恶意的破坏非法的存取。防范对象是非法用户非法操作

DBMS提供的服务

  1. 提供定义完整性约束条件的机制
  2. 提供完整性检查的方法
  3. 违约处理

三类完整性约束定义

实体完整性

也就是说主码。单属性的码可以是列级或者表级别,但是多属性的码只能是表级别。

实体完整性检查和违约处理

插入或对主码更新时,RDBMS会检查

  1. 主码是否唯一。不唯一拒绝插入或修改
  2. 主码各个属性是否为空。只要有一个为空就拒绝插入或修改

参照完整性

FOREIGN KEY(Sno) REFERENCES Student(Sno) ON [DELETE | UPDATE ] CASCADE

参照完整性检查和违约处理

image-20260121141116316
插入

受限插入:不允许插入一个不存在的外键

递归插入:先在被参照表中插入这个元组,再在参照表中插入元组

修改

受限修改:自己想去吧我操了怎么这么多

删除

级联删除:也就是递归删除嘛

受限删除:系统拒绝

置空删除:前提是不是被参照表的主码

用户定义完整性

Ssex varchar(8) CEHCK (Ssex IN('male', 'female'));

CONSTRAINT check_sex CHECK (Ssex IN('male', 'female'));

ALTER TABLE Student
ADD CONSTRAINT check_sex CHECK(...);

ALTER TABLE Student
DROP CONSTRAINT check_sex;

触发器

定义触发器

CREATE TRIGGER <触发器名>
{BEFORE | AFTER} <触发事件>
ON <表名>
FOR EACH {ROW | STATEMENT}
[WHEN <触发条件>]
<触发动作体>

第六章 关系数据理论

会分析函数依赖(给定一些关系,分析函数依赖,给出关系候选码,最高满足第几范式,并给出判断依据,

函数依赖 多值依赖 能判断什么是函数依赖什么是多值依赖

传递函数依赖,部分函数依赖

找出设计存在的问题,存在哪些异常,数据冗余,更新异常,插入异常,删除异常,为什么会出现这些异常(与函数依赖,规范化程度有关),并进行修改)

1,2,3范式,BCNF范式 重点 他们之间的规范化递进关系,消除了什么依赖到达下一级范式

对关系的分解 什么是无损连接性的分解 什么是函数依赖性的分解 通过一些分解,能够达到更高一级的范式。

函数依赖

定义

设R(U)是一个属性集U上的关系模式,X和Y是U的子集。若对于R(U)的任意一个可能的关系r,r中不可能存在两个元组在X上的属性值相等,而在Y上的属性值不等,则称“X函数确定Y” 或 “Y函数依赖于X”。

同时,称X为函数依赖的决定属性组,也称为决定因素

什么是数据依赖?

  • 一个关系内部属性与属性的一种约束关系
  • 通过属性间值得相等与否体现出来得数据间相关连接

平凡函数依赖和非平凡函数依赖

image-20260121132323469

部分依赖

传递依赖

多值依赖

定义

设R(U)是一个属性集U上的一个关系模式,X、Y和Z是U的子集,并且Z=U-X-Y。关系模式R(U)中多值依赖 X →→Y成立,当且仅当对R(U)的任一关系r,给定的一对(x, z)值,有一组 Y 的值,这组值仅仅决定于x值而于z值无关

image-20260121140109751

特性

image-20260121141703076

例子

  1. 学校中一门课程由多个老师讲授,它们使用相同的一套参考书。每个教员可以讲授多门课程,每种参考书可以供多门课程使用

课程对老师是一对多,课程对教材是一对多,老师对教材是多对多

image-20260121135431820

此时具有唯一候选码(C、T、B)

此时是BCNF,但存在插入删除修改复杂的问题(没有错误),数据冗余度大。

  1. 关系模式WSC (W,S,C)
    • W表示仓库,S表示管理员,C表示商品
    • 假设每个仓库有若干个保管员,有若干种商品(两个一对多)
    • 每个保管员保留所在的仓库的所有商品
    • 每种商品被所有保留员保管(一个多对多)
image-20260121140507995

规范化

image-20260121133618337

四大问题

数据冗余

浪费大量的存储空间

更新异常

数据冗余,更新数据时,维护数据完整性代价大(一个数据变了,多条记录要修改)

插入异常

该插的数据插不进去(主键还不存在值)

删除异常

不该删除的数据不得不删(本该存档的记录全删了,其他关系里没这个数据)

1NF

如果一个关系模式R的所有属性都是不可分的基本数据项

2NF

定义

R 是 1NF,且每一个非主属性完全函数依赖于码

消除了部分依赖,存在传递依赖的问题

例子(1NF -> 2NF)

S-L-C(Sno, Sdept, Sloc, Cno, Grade)

异常

  • 插入异常:一个学生还没选课,那么选不上
  • 删除异常:学生退课后,学生不存在了
  • 数据冗余:选修四门课程,就要重复四个相同的sloc
  • 修改复杂:修改某个学生的sdept还要修改多个sloc

解决方法

模式分解法(投影分解法)

S-L-C分解为两个关系模式,以消除这些部分函数依赖

SC(Sno, Cno, Grade)

S-L(Sno, Sdept, Sloc)

3NF

定义

每一个非主属性既不部分依赖于码也不传递依赖于码

消除了传递依赖

例子(2NF -> 3NF)

S-L(Sno, Sdept, Sloc)

异常

  • 插入异常:新建的系还没有学生,不能插入
  • 删除异常:学生没有
  • 数据冗余度大:
  • 修改复杂:

解决方法

投影分解法,分解成两个关系模式

BCNF

定义

若关系模式R<U, F> 是 1NF,若 X → Y 且 Y 不属于 X 时(Y非平凡函数依赖于X),X必含有码,则R<U, F> 是 BCNF

每一个决定因素都包含码

如果R是3NF并且只有一个候选码,那么此时也是BCNF

存在多值依赖问题

例子

以下为BCNF
image-20260121134151615 image-20260121134204654 image-20260121134219703
是3NF但不是BCNF
image-20260121134347089

T是决定因素但不是码,所以不符合BCNF

  • 插入异常:新来老师已经确定上哪门课,但是还没有学生选,不能插入数据库
  • 删除异常:学生毕业后,把学生及选课记录都删掉,同时删掉了老师教哪门课的信息
  • 数据冗余:老师教哪门课的信息重复存放,有多少学生选冗余存储多少次
  • 修改复杂:如果一个老师修改所教的课,修改多条记录

4NF

不允许有非平凡且非函数依赖的多值依赖,允许的非平凡多值依赖是函数依赖

第七章 数据库设计

数据库设计的基本步骤

image-20260117135810997

需求分析

重点是数据和处理

数据字典

进行详细的数据收集和数据分析所获得的主要结果

包含了数据项、数据结构、数据流、数据存储、处理过程

概念结构设计

将需求分析得到的用户需求抽象为信息结构即概念模型的过程就是概念结构设计

描述概念模型的工具:ER图

设计概念结构的四类方法

自顶向下:先定义全局,再逐步细化

自底向上:先定义局部,然后集成起来,最后得到全局概念结构

逐步扩张:先定义核心概念结构,然后向外扩充,滚雪球的方式生成其他概念结构

混合策略:自顶向下和自底向上的结合。用自顶向下策略设计一个全局概念结构的框架,以它为骨架集成由自底向上策略中设计的各局部概念结构。

我们一般使用自顶向下进行需求分析,然后通过自底向上设计概念结构

视图的集成——合并,修改与重构

合并分E-R图存在冲突,有以下几类冲突

属性冲突

属性值的类型、取值范围、取值集合不同;属性取值单位冲突

比如有人把学号设计成varchar,有人是long int

命名冲突

同名异意、异意同名

结构冲突

同一对象再不同应用具有不同的抽象

“课程”在某一局部应用中被当作实体, 在另一局部应用中则被当作属性

解决方法:通常是把属性变换为实体或把实体变换为属性,使同一对象具有相同的抽象。变换时要遵循两个准则。

(1)作为属性,不能再具有需要描述的性质,即属性必须是不可分的数据项,不能包含其他属性。

(2)属性不能与其他实体具有联系,即E-R图中所表示的联系是实体之间的联系。

凡满足上述两条准则的事物,一般均可作为属性对待。

ER图向关系模型转换需要解决的

  1. 如何将实体型和实体间的联系转换为关系模式
  2. 如何确定这些关系模式的属性和码

转换原则

  • 一个 1:1 联系可以转换为一个独立的关系模式,也可以与任意一段对应的关系模式合并
  • 一个 1:n联系可以转化为一个独立的关系模式,也可以与n端对应的关系模式合并
  • 一个m:n联系转换为一个关系模式

第八章 数据库编程

嵌入式SQL与主语言的通信

image-20260117143755954

SQL通信区

向主语言传递SQL语句的执行状态信息

使主语言能够据此控制程序流程

主变量

主语言向SQL语句提供参数(输入主变量)

将SQL语句查询数据库结果交主语言进一步处理(输出主变量)

为了与数据库对象名(表名、视图名、列名等)区别,SQL语句中的主变量名前要加冒号(:)作为标志

游标

解决集合性操作语言与过程性操作语言的不匹配

SQL语言是面向集合的,一条SQL语句原则上可以产生或处理多条记录
主语言是面向记录的,一组主变量一次只能存放一条记录
仅使用主变量并不能完全满足SQL语句向应用程序输出数据的要求
嵌入式SQL引入了游标的概念,用来协调这两种不同的处理方式

游标是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果。用户可以用SQL语句逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理

使用方法
EXEC SQL DECLARE<cursor_name> CURSOR
	FOR <SELECT phase>;
	
EXEC SQL OPEN <cursor_name>

第九章 关系数据库存储管理

顺序表索引

稠密索引

  • 索引块中存放每条记录的索引属性值以及指向相应记录的指针

稀疏索引

  • 基本表的每个物理存储块只对应一个索引项

多级索引

  • 第一级索引是稠密或稀疏索引
  • 第二级及以上为建立在上一级索引上的稀疏索引
  • 重复直到尺寸合适

第十章 关系查询处理和查询优化

查询处理步骤

1. 查询分析

对查询语句进行扫描、词法分析和语法分析

2. 查询检查

根据数据字典对合法的查询语句进行语义检查

检查通过后把SQL查询语句转换称等价的关系表达式,RDBMS一般都用查询树来标识扩展的关系代数表达式

3. 查询优化

选择一个高效执行的查询处理策略

关系查询优化是影响RDBMS性能的关键因素

概述

查询优化的优点不仅在于用户不必考虑如何最好地表达查询以获得较好的效率,而且在于系统可以比用户程序的“优化”做得更好

  • 优化器可以从数据字典中获取许多统计信息,而用户程序则难以获得这些信息
  • 如果数据库的物理统计信息改变了,系统可以自动对查询重新优化以选择相适应的执行计划。在非关系系统中必须重写程序,而重写程序在实际应用中往往是不太可能的
  • 优化器可以考虑数百种不同的执行计划,程序员一般只能考虑有限的几种可能性。
  • 优化器中包括了很多复杂的优化技术,这些优化技术往往只有最好的程序员才能掌握。系统的自动优化相当于使得所有人都拥有这些优化技术

代数优化

查询树的启发式规则
  1. 选择运算应尽可能先做。这是最重要、最基本的一条
  2. 投影运算和选择运算同时进行。若有若干投影和选择运算,并且它们都对同一个关系操作,则可以在扫描此关系的同时完成所有的这些运算以避免重复扫描关系
  3. 投影同其前或其后的双目运算结合起来
  4. 把某些选择同在它前面要执行的笛卡尔积结合起来成为一个连接运算
  5. 找出公共子表达式
image-20260117130206001

首先选择优先做,所以select放SC前面,然后笛卡尔+选择=自然连接,最后投影即可

物理优化(稍微看看)

物理优化就是要选择高效合理的操作算法或存取路径,求得优化的查询计划

选择操作的启发式规则

总结一下:占比大的用全表顺序扫描,占比小的(或主码=值)用索引

  1. 小关系全表扫描,即使选择列上有索引
  2. 对于大关系
    • 选择条件是 主码 = 值
      • 查询结果最多一个元组,可以选择主码索引
      • 一般RDBMS自动建立主码索引
    • 选择条件是 非主属性 = 值,非主属性查询 或 范围查询,并且选择列上有索引
      • 估算查询结果的元组数目
        • 比例小用索引扫描方法
        • 比例大用全表顺序扫描
    • 对于用AND连接的合取选择条件
      • 如果有涉及这些属性的组合索引
        • 优先采用组合索引扫描方法
      • 如果某些属性上有一般的索引
        • 索引扫描方法
        • 否则使用全表顺序扫描。
    • 对于用OR连接的析取选择条件,一般使用全表顺序扫描
连接操作的启发式规则

4. 查询执行

连接操作实现

嵌套循环方法

  1. 对外层循环中的每一个元组,检索内存循环中的每一个元组
  2. 检查这俩元组在连接属性上是否相同
  3. 如果满足连接条件,则串接后作为结果输出,直到外层循环表中的元组处理完为止

排序-合并方法

  1. 如果连接的表没有排好序,先对Student表和SC表按连接属性Sno排序
  2. 取Student表中第一个Sno,依次扫描SC表中具有相同的Sno的元组
  3. 当扫描到Sno不相同的第一个SC元组时,返回Student表扫描它的下一个元组,再扫描SC表中具有相同Sno的元组,把它们连接起来
  4. 重复上述步骤直到Student表扫描完

索引连接方法

  1. 在SC表上建立属性Sno的索引,如果原来没有该索引
  2. 对Student中每一个元组,由Sno值通过SC的索引查找相应的SC元组
  3. 把这些SC元组和Student元组连接起来
image-20260117124713912

Hash Join方法

  1. 将Sno作为hash码,将Student表按hash函数分散到hash桶中
    划分阶段:对包含较少元组的表进行一遍处理,把它的元组按hash函数分散到hash表的桶中
Hash码 200215121 200215236
元组 200215121刘永25 200215236 王丽丽23
  1. Sno 作为hash码,将SC表的各个元组按hash函数分散到适当的hash桶中
    试探阶段/连接阶段:对另一个表进行一遍操作,把元组散列到适当的hash桶中,把元组与桶中所有来自前一个元组并与之相配的元组连接起来
Hash码 200215121 200215236
元组 200215121,刘永,25 200215121,95001,90 200215121,95002,85 200215236, 王丽丽,23 200215236,95003,93

选择、连接操作物理优化的启发式规则

第十一章 数据库恢复技术

事务的基本概念

定义

事务是用户定义的一个数据库操作序列,这些操作要么全做要么都不做,是一个不可分割的工作单位

事务的特性

恢复技术能保证事务的原子性、持续性

并发控制能保证事务的一致性、隔离性

原子性

事务中包括的诸操作要么都做,要么都不做

一致性

事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。其中一致性代表数据库中只包含成功事务提交的结果(COM、ROL)。

隔离性

对并发执行而言,一个事务的执行不能被其他事务干扰

持续性

一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。

恢复实现技术

数据转储

海量、增量、静态、动态

日志

日志文件(log)是用来记录事务对数据库的更新操作的文件

为什么要先写日志文件,再写数据库

写数据库和写日志文件是两个不同的操作,在这两个操作之间可能发生故障。如果先写了数据库修改,而在日志文件中没有登记下这个修改,则以后就无法恢复这个修改了。如果先写日志,但没有修改数据库,按日志文件恢复时只不过是多执行一次不必要的UNDO操作,并不会影响数据库的正确性。

恢复策略

事务内部故障

非预期的,不能由应用程序处理的。包含运算溢出、死锁撤销、违反完整性约束等

不一致原因

事务在运行至正常终止点前被终止

恢复方法

利用日志文件UNDO此事务已对数据库的修改

  1. 反向扫描日志,查找该事务的更新操作
  2. 对该事务的更新操作执行逆操作
  3. 继续扫描,同样处理,直到读到此事务的开始标记

系统故障

称为软故障,是指造成系统停止运转的任何事务,使得系统需要重新启动

不一致原因

未完成事务对数据库的更新已写入数据库,已提交事务对数据库的更新还留在缓冲区没来得及写入数据库

恢复方法

UNDO故障发生时未完成的事务,REDO已完成的事务。

  1. 正向扫描日志,将故障发生前已经提交的事务放入重做队列;将故障发生时未完成的事件放入撤销队列
  2. 对撤销队列事务进行撤销处理:反向扫描日志文件,对每个UNDO事件的更新操作执行逆操作
  3. 对重做队列事务进行重做处理:正向扫描日志文件,对每个REDO事件重新执行登记的操作

介质故障

称为硬故障,指外存故障

恢复方法

需要重装数据库,并重做已完成的事务

  1. 装入最新的后备数据库副本,使数据库恢复到最近一次转储时的一致性状态
  2. 装入有关的日志文件副本,重做已完成的事务。

具有检查点的恢复技术

问题提出

  • 搜索整个日志将耗费大量的时间
  • REDO处理:重新执行,浪费了大量时间

解决方法

  • 在日志文件中增加检查点记录(checkpoint)
  • 增加重新开始文件
  • 恢复子系统在登录日志文件期间动态地维护日志

恢复步骤

  1. 从重新开始文件中找到最后一个检查点记录在日志文件中的地址,由该地址在日志文件中找到最后一个检查点记录
  2. 由该检查点记录得到检查点建立时刻所有正在执行的事务清单ACTIVE-LIST,建立两个事务队列:UNDO-LIST,REDO-LIST。把ACTIVE-LIST暂时放入UNDO-LIST队列,REDO队列暂为空
  3. 从检查点开始正向扫描日志文件,直到日志文件结束。新开始的事务暂时放到UNDO-LIST,如果提交了就直接放到REDO-LIST
  4. 对UNDO-LIST中的每个事务执行UNDO操作,对REDO-LIST中的每个事务执行REDO操作

优势

  • 使用检查点方法可以改善恢复效率
    • 在检查点之前提交的事件不用REDO了

第十二章 并发控制

并发控制概述

由于并发操作破坏了事务的隔离性,导致了数据不一致。所以我们通过并发控制,就是要用正确的方式调度并发操作,使一个用户事务的执行不受其他事务的干扰,从而避免造成数据的不一致性

并发控制机制的任务

  • 对并发操作进行正确调度
  • 保证事务的隔离性
  • 保证数据库的一致性
    • 丢失修改
    • 不可重复度
    • 读脏数据

不一致性问题

丢失修改

两个事务T1和T2读入同一数据并修改,T2的提交结果破坏了T1提交的结果,导致T1的修改被丢失

比如说一张机票有16张,A和B同时知道了这件事,然后同时购买,结果两个人买了后机票还有15张

不可重复读

不可重复读是指事务T1读取数据后,事务T2执行更新操作,使T1无法再现前一次读取结果

  • 事务T1读取A,T2对A进行了修改,T1再次读A的时候得到了与前一次不同的值
  • 事务T1按一定条件从数据库读取了某些数据记录后,事务T2删除了其中部分记录,党T1再次按相同条件读取数据时,发现某些记录消失了
  • 事务T1按一定条件从数据库中读取某些数据记录后,事务T2插入了一些记录,当T1再次按相同条件读取数据时,发现多了一些记录

读脏数据

  1. 事务T1修改某一数据,并将其写回磁盘
  2. 事务T2读取同一数据后,T1由于某种原因被撤销
  3. 这时T1已修改过的数据恢复原值,T2读到的的数据就与数据库中的数据不一致
  4. T2读到的数据就为脏数据,即不正确的数据

基本封锁类型

这不就是经典的读者-写者问题。作者在写的时候,必须保证没有人在读,并且只能一个人写。作者写好了,读者才能读,而且很多人一起读都可以。

image-20260116191209138

排他锁

又称为写锁。若事务T对数据对象A上X锁,则只允许T读取和修改A,其他的任何事务都不能再对A加任何类型的锁,直到T释放A上的锁

共享锁

又称为读锁,若事务T对数据对象A加上S锁,则其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。

封锁机制

用于解决并行操作带来的数据不一致性问题

一级封锁机制——解决丢失修改问题

修改之前加X锁。本质上就是说写者写的时候读者不准读。但是我们读的时候没有加锁。

事务T在修改R之前必须对其加X锁,直到事务结束(COM和ROL)才释放

image-20260116192157871

二级封锁机制——解决读脏数据问题

读取之前加S锁,读完后即可释放S锁。可以防止丢失修改和读脏数据,但由于读完数据即可释放S锁,所以不能保证可重复读。

加上事务T在读取R之前必须先对其加S锁,读完后方可释放S锁。

image-20260116192901313

三级封锁机制——解决不可重复读问题

读取之前加S锁,事务结束后即可释放S锁

image-20260116193426599

活锁和死锁

解决合理调度问题

活锁——饥饿

因为X锁拥有绝对的优先级,可能导致S锁无限等待

image-20260116193700235

解决方法

先来先服务

死锁

预防死锁

破坏死锁的必要条件

一次封锁法(破坏请求保持条件)

要求每个事务必须一次将所有要使用的数据全部加锁,否则不能继续执行

顺序封锁法(破坏循环等待条件)

预先对数据对象规定一个封锁顺序,所有事务都按照这个顺序实行封锁

诊断死锁

超时法

如果一个事务的等待时间超过了规定的时限,就认为发生了死锁

等待图法

用事务等待图动态反映所有事务的等待情况

image-20260116194206139

比如图a中,T1等待T2,同时T2等待T1

解除死锁

选择一个处理死锁代价最小的事务,将其撤消

两段锁协议(2PL)

最常用的一种封锁协议,并且产生的是可串行化调度

  • 在对任何数据进行读、写操作之前,事务首先要获得对该数据的封锁
  • 在释放一个封锁之后,事务不再申请和获得任何其他封锁

含义

一阶段——获得封锁(扩展阶段)

事务可以申请获得任何数据项上的任何类型的锁,但不能释放任何锁

二阶段——释放封锁(收缩阶段)

事务可以释放任何数据项上的任何类型的锁,但是不能再申请任何锁

例子

这个是对的

image-20260116200831228

这个是错的

image-20260116200842653

但不是说由于不符合两端锁所以是错的,因为两段锁协议是可串行化调度的充分条件

并发调度的可串行性

可串行化调度

多个事务的并发执行是正确的,当且仅当其结果与按某一次序串行地执行这些事务时的结果相同。

可串行性

一个给定的并发调度,当且仅当它是可串行化的,才认为是正确调度。

冲突操作

冲突操作是指不同的事务对同一个数据的读写操作和写写操作。不同事务的冲突操作和同一事务的两个操作不能交换

可串行化调度的充分条件

一个调度Sc在保证冲突操作的次序不变的情况下,通过交换两个事务不冲突操作的次序得到另一个调度Sc',如果Sc‘ 是串行的,则称Sc为冲突可串行化的调度

也就是说满足冲突可串行化,也就是说冲突操作顺序不变,则一定是可串行化调度;如果不满足冲突可串行化,那是不是可串行化调度说不准,要自己分析

封锁粒度

封锁对象的大小称为封锁粒度

  • 显式封锁:直接加到数据对象上的封锁

  • 隐式封锁:该数据对象上没哟独立加锁,但是其上级节点加锁而使得该数据对象加上了锁

    二者效果一样

意向锁

提高对某个数据对象加锁时系统的检查效率

  • 如果对一个节点加意向锁,则说明该结点的下层节点正在被加锁
  • 对任一节点加基本锁,必须先对它的上层节点加意向锁

常用意向锁:

  • 意向共享锁
  • 意向排它锁
  • 共享意向排它锁

意向锁:

  • 提高了系统的并发度
  • 减少了加锁和解锁的开销
  • 在实际的数据库管理系统产品中得到广泛使用。
posted @ 2026-01-17 18:31  Pocon  阅读(42)  评论(0)    收藏  举报