SQL数据库理论学习(三)

Armstrong公理系统的有效性与完备性
有效性:由F出发根据公理系统推导出来的函数依赖一定在F+中
完备性:F+中的函数依赖,都可根据公理系统导出来

函数依赖集等价:
如果说G+=F+(闭包),F和G等价或覆盖
最小依赖集:
(1).F中任一函数依赖的右部仅含有一个属性
(2).F中不存在这样的函数依赖X->A,使得F-{X-A}等价(不存在传递函数依赖)。
(3).F中不存在这样的函数依赖X->A,X有真子集Z使得F-{X->A}并{Z-A}等价(左部不存在部分依赖)。

数据字典:数据字典是指对数据的数据项、数据结构、数据流、数据存储、处理逻辑等进行定义和描述

常用抽象:
1.分类 2.聚集 3.概括
1.将属性分类成为一个个实体
2.聚集将各个属性聚集为各个实体
3.定义了一种子集联系,继承性

三类结构冲突:
1.同一对象在不同应用中具有不同的抽象
2.同一实体在不同的局部视图中所包含的属性不完全相同,或者排列次序不同
3.实体之间的联系在不同局部视图中呈现不同的类型

数据库设计:概念模式设计
消除冗余的方法:
1.分析法 2.数据规范化理论

数据库的逻辑结构设计:将现实生活中的概念进一步转化为相应的数据模型
1.将概念结构转化为一般关系,如网状,层次
2.将转化来的关系继续向DBMS支持下的数据模型转换
3.对数据模型进行优化
4.设计用户子模式
转换内容:将E-R图转换为关系模式

优化数据模型的方法:
1.确定数据依赖
2.对各个关系模式之间进行极小化处理,消除冗余联系
3.按照数据依赖理论对关系模式逐一分析,为第几范式

提高效率和存储空间的利用率
1.水平分解:按元组分割,80/20原则
2.垂直分解:按属性列分为若干子模式,在查询时需要连接
2.1直观分解或分解算法分解

嵌入式SQL
DBMS处理宿主型数据库语言sql
1.预编译
2.修改和扩充主语言使主语言可以处理
嵌入式语言:
1.说明性语言
2.可执行语言:2.1数据定义 2.2数据控制 2.3数据操作

工作单元之间的通信方式:
1.sql通信区 2.主变量 3.游标
主语言面向记录,sql语言面向集合
游标:游标是系统为用户开设的一个数据缓冲区存放sql语句的执行结果
每个游标都具有一个名字

1.游标代码:

declare x1 cursor for <sql语句>
open x1   /*当游标X1执行时,才执行sql语句*/

2.打开游标

exec sql open <游标名>

3.移动游标指针,取当前记录

exec sql fetch [[NEXT|PRIOR|FIRST|LAST] <游标名> into <主变量> [<指示变量>]]

3.1主变量必须以select语句中的目标列一一对应
3.2fetch通常在一个循环结构中

4.关闭游标

exec sql close <游标名>

关系查询处理与优化:
1.查询分析:语法,语义,符号名的分析
2.查询检查:安全性和完整性(实体完整性,参照完整性,用户自定完整性)
3.查询优化:关系代数(代数的一些列运算)优化,物理优化
4.查询执行:代码生成

查询优化的重要性和必要性:
重要性:
关系系统的查询优化既是RDMS实现的关键技术又是关系系统的优点,减轻了用户选择存取路径的负担。
必要性:
优化器可以做到用户所做不到的事情,并且提高查询效率
选择操作的实现。如果数据库的物理统计信息改变了,系统可以自动的执行计划。

查询操作的算法操作
选择操作的实现
1.简单的全表扫描方法(where 后无条件) 2.索引查找
连接操作的实现
1.嵌套循环方法 (笛卡尔积类似 ,最多mXn次) 2.排序合并方法(最多有m+n):效率较高 3.索引连接方法 4.哈希查找

查询优化的一般步骤:
1.吧查询转换成某中内部表示:转换为元组语法树
2.代数优化:吧语法树转换为标准(优化)形式
3.物理优化:选择低层的存取路径
4.生成查询计划,选择代价最小的

查询树的启发式优化的一般准则:
1.选择运算尽可能先做
2.吧投影和选择同时进行
3.吧投影同其前或后的双目运算结合
4.吧某些选择同在他前面要执行的笛卡尔积结合起来成为一个连接运算
5.找出公共子表达式

代价模型:
1.集中式数据库
单用户:I/O代价+CPU代价
多用户: I/O代价+CPU代价+内存代价
2.分布式数据库
中代价=I/O代价+CPU代价+内存代价+通信代价

执行策略:
1.读取总快数=读student表快数+读SC表遍数*每遍的快数

结合关系代数变换准则所得的关系代数表达式的优化算法
1:分解选择运算
2.通过交换选择运算,将其尽可能的移动到叶端:4-8的关系代数规则
3.通过交换投影运算,将其尽可能的移动到叶端:3,9,10,5中的一般形式
4.合并串接的选择和投影成单个选择、单个投影或一个选择后跟一个投影
5.对内节点分组(吧每一个双目运算和他所有的直接祖先(选择和投影运算)分为一组)
6.生成程序

通过sql语句得出一般语法树:
1.from 以后的表为树的叶子节点
2.先进性笛卡尔积,例:join(student.sno=sc.sno)
3.进行选择条件,例:select(SC.cno=‘C2’)
4.进性投影,例:project(Sname)
关系代数语法树对应:

3.物理优化:
3.1选择字段上是否有索引
3.2连接的两个表是否有序
3.3连接字段上是否有索引
对于查询优化采取哪种策略:

1.基于规则的启发式优化
对于小表可以使用顺序扫描
对于选择条件是主码=值的查询,并且列上有索引,如果查询元素较少,采用索引否则全表索引
对于OR连接的分析选择条件索引使用全表扫描

连接操作的启发式规则
如果2个表都已经按照连接属性排序,则选用排序-合并方法
如果一个表在连接属性上有索引,则可采用索引连接方法
如果两个条件都不适合,则采用哈希(hash join)方法
最后选择循环嵌套法,并让比较小的表作为外循环的表
2.基于代价估算的优化
统计信息包括每个表的元组个数,元祖长度,占用的快数,占用的溢出块数
3.两者结合的方法

关系系统:当支持关系数据库或支持选择、投影和(自然)连接运算,且不要求用户定义任何物理存取路径
关系系统的分类:
1.表式系统 2.(最小)关系系统 3.关系完美系统

数据库恢复技术与并发性控制

事务

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

事务和程序是两个不同的概念:
1.一个事务可以是一条sql语句,一组sql语句或整个程序
2.一个应用程序通常包含多个事务

事务是恢复和并发控制的基本单位
如何定义事务:
1.显示定义方式:

BEGIN TRANSACTION       BEGIN transaction 
	SQL 语句1               SQL  语句1
	SQL 语句2               SQL  语句2
COMMIT                  Rollback

commit结尾为事务正常结束,提交事务的所有操作,通过commit将缓冲区里的数据全部永久生效
rollback结尾为事务异常结束(会回滚事务的所有更新操作,回滚到开始的位置)

2.隐式方式:用户没有自己定义事务时,DBMS按缺省规定自动划分事务

事务的ACID特性是事务处理的任务:

事务是数据库的逻辑工作单位

1.原子性(Atomicity):
2.一致性(Consistency):事务执行的结果必须是使数据库从一个一致性态变到另一个一致性状态(数据库中只包含成功事务提交的结果,一个状态只能有一 个事务进行处理)
3.隔离性(isolation):一个事务的执行不能被其他事务干扰
4.持续性(durability):永久性,一个事务一旦提交,他对数据库中的数据修改就应该是永久性

破坏事务ACID的因素:
1.多个事务并运行时,不同事务的操作交叉执行
2.事务在运行过程中强行停止

数据库恢复,系统故障的恢复:
1.清除尚未完成的事务对数据库的所有修改:系统重启时,恢复程序要强行撤销所有未完成事务
2.将缓冲区中已完成事务提交的结果写入数据库:系统重启时,恢复程序需要重做所有已提交的事务

介质发生错误时(磁盘):
1.恢复操作的基本原理冗余:利用存储在系统其他地方的冗余数据来重建数据库中已经破坏的部分数据

恢复的实现技术:
1.如何建立冗余数据:数据转存 , 2.登录日志文件(以记录和数据库为单位)
2.1日志中的内容
各事务的开始标记
各事务的结束标记
各事务的所有更新操作
各事务有关的内部更新操作
介质故障恢复:log file +动态转储后备副本(转储期间允许对数据库进行存取或修改,但不能保证数据的正确有效,因为在转储期间发生过修改使得后备副本上的数据不是数据库的一致版本)

恢复的基本原理:利用存储在后备副本日志文件和数据库镜像中的冗余数据重建数据库

事务故障
事务恢复的日志:
1.反向扫描文件日志(从最后向前扫描日志文件)
2.对该事务的更新操作执行逆操作

系统故障造成的数据库不一致状态的原因
1.undo故障发生时未完成的事务全部撤销
2.redo已完成的事务,将已经完成的数据库的值利用日志文件新值更换数据库中的旧值

系统故障恢复步骤:
1.正向扫描日志文件
2.将已经完成的事务挂载redo对列执行redo操作(正向扫描日志文件)
3.对未完成的操作挂在undo对列执行undo操作(反向扫描文件)

具有检查点的恢复技术
1.在日志文件中增加检查点的记录
2.增加重新开始新文件
3.恢复子系统在登记日志文件期间动态的维护日志文件(具有重新开始文件存放各日志文件的物理地址)

在什么位置需要放入做redo、undo操作
1.对数据库的操作在检查点前 不做操作
2.在检查点后故障前做redo操作
3.在故障点后做undo操作

什么是转储:
1.静态转储(静止存储)与动态转储
2.海量转储与增量转储

日志文件内容:用来记录事务对数据库的更新操作的文件(1.以记录为单位、2.以数据块为单位)
数据库镜像:介质故障发生并出现严重性的错误导致数据库无法运行
没有出现故障时:可用于并发操作 、互斥访问、其他用户可以读镜像数据库上的数据

提高恢复效率的技术:
1.检查点技术 2.镜像技术

数据库的并发控制:
对并发操作正确的调度 保证事务的隔离性 保证数据的一致性
包括(丢失修改,不可重复读,读"脏"数据)

封锁:针对事务的并发性,保证数据的一致性和隔离性
基本封锁类型:
1.排他锁(写锁,x锁):只允许一个事务进行操作
2.共享锁(读锁,s锁):都可以进行读操作
封锁产生的问题: 死锁和活锁(优先处理当前时间进行请求的事务)

检测死锁:
1.超时法:一个事务超过了规定了时间,就认为发生了死锁
缺点:有可能误判死锁 ,时限太长,死锁发生后不能及时发现
2.等待图法(查询有向图是否有回路)

当并行的结果与某一顺序的串行操作相同的时候说明此并行执行的事务是正确的成为 可串行化调度策略
可串行化调度策略可能会发生死锁
冲突操作:不同的事务在同一时间段对同一数据进行读写操作(容易读"脏")和写写操作

冲突可串行化调度策略:
例:
scr1=r1(A)w1(A)r2(A)w2(A)r1(B)w1(B)r2(B)w2(B)
通过交换不冲突
scr2=r1(A)W1(A)r1(B)W1(B)r2(A)W2(A)r2(B)W2(B)
这样scr1为一个冲突可串行化调度策略

两级锁协议:从加锁和解锁的时间考虑,保证数据的一致性
锁协议:对数据对象加锁时,具有的一些列规则
一级封锁协议:事务在修改数据时进行加锁,直到事务结束才释放(避免写写冲突)
二级封锁协议:在读取的时候加上锁,读完之后释放锁
三级封锁协议:一级封锁家加上事务T在读取之前必须对其加S锁,在事务结束之后才释放

两段锁协议:从加锁和解锁的规律角度
一次封锁法:每个事务必须一次将所有要使用的数据全部加锁,否则不能继续执行。因此一次封锁法遵守两段锁协议

两段锁协议与三级封锁协议:
两段锁协议:保证并发调度的正确性
三级封锁协议:在不同程度上保证数据的一致性
遵守第三级封锁协议必然遵循两段锁协议
两段锁协议必定是可串行调度策略

选择封锁粒度的原则:
1.封锁的粒度越 大,小,
2.系统被封锁的对象 少,多,
3.并发度 小,高,
4.系统开销 小,大,
多粒度锁:显式封锁 隐式封锁 ----因为要考虑到上级结点与下级节点以及数据对象是否会与该结点上的锁是否会产生冲突提出『意向锁(不用考虑下级,只用考虑本级和上级)』。
分为意向共享锁、意向排他锁、共享意向排它锁

锁的强度: X —SIX-----S AND IX ------IS-----。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值