《高级数据库系统》学习笔记

时间:2019-01-06 15:59:21   收藏:0   阅读:353

前言

文本为根据学堂在线 xuetangx.com 的《高级数据库系统》课程的学习视频与讲义,以及习题整理得到的,主要用于概念梳理和(针对本人的)重难点摘录。仅供交流学习用途,如有遗漏或错误,请指出,谢谢!
PS:第一次用markdown写,并且是这里的第一篇正式博客,加油!(由于版权原因吧,网站只提供了图片形式讲义,因此如果涉及到相关问题,必将改正,还请谅解)
后记:用markdown写完好乱……基本上变成ppt的复刻了,前面重新排版了部分内容,后面的等用了再部分归纳,里面一些概念理解的确不到位,需要指点……

课程目录

第一讲 数据文件的组织与索引技术
第二讲 查询处理与优化
第三讲 数据管理与恢复技术
第四讲 事务并发调度的相关概念
第五讲 基于封锁的并发控制机制
第六讲 并发控制的其他机制
第七讲 分布式数据库基本概念
第八讲 分布式数据库的设计
第九讲 分布式数据库查询机制
第十讲 分布式数据库的事务管理及恢复机制

第一讲 数据文件的组织与索引技术

掌握数据库的数据组织和储存方式,掌握常用的索引结构,顺序索引,B+树索引,散列索引

1.1 数据文件的组织:

字段:一定长度的字节序列
记录:定长记录;变长记录
集合:物理邻接;指针连接;mixed
大字段值(BLOBS):存储在一系列块中,且这些块在磁盘上顺序分配

1.2 文件组织形式:

    优点:按搜索码检索,效率高
    缺点:不利于插入删除操作,维护困难
    优点:便于插入删除操作;不需要索引区,节省存储空间
    缺点:支持按搜索码的随机查询;哈希函数选择不当易造成桶倾斜
    优点:支持高效率的多表连接查询
    缺点:降低单表查询的效率
    优点:减少无用数据的读入量;利用数据压缩减少访问磁盘次数

1.3 数据文件索引结构

  聚集索引--非聚集索引
  稠密索引--稀疏索引
  有序索引--散列索引
总体结构上,是一种多级索引,采用平衡树结构,参考《数据结构》B+树的相关知识
结构:根节点;叶节点;非叶节点
特点:可以作主索引,也可以作辅助索引;作主索引时,可以是稀疏的,或稠密的。
查询:从一个根节点到叶节点的路径遍历过程,这个路径长度不超过 log[(n-1)/2]K
效率:
    节点大小n是根据存储块的大小决定的,n足够大时,分裂合并(维护成本高的)情况少。
    一般不多于三层;磁盘I/O数量是层数+1
    假设磁盘大小4K,键值对大小20Byte,n约等于200,每个节点半满,三层B+树包含键值总数约100万个;
可扩展散列特点:散列函数值转化为二进制,前i位表示桶的数量,桶数量是2的幂
散列索引特点:桶扩展代价大;直接寻址,支持随机查找;散列函数寻找困难

1.4 appendix

自学:分段散列索引;R树索引;kd树索引;四叉树索引的结构和使用范围。
习题:
    散列文件适合于特定值的查询,此种文件组织不适合建立索引。(正确)

第二讲 查询处理与优化

掌握查询处理过程。包括:语法分析,生成查询语法树,把语法树转换成关系代数表达式,利用等价变换优化代数表达式,创建物理查询计划。

2.1 查询代价的测量方式

  查询代价:查询所涉及资源(磁盘存取,CPU时间,通信开销)的使用情况
  响应时间 = 磁盘存取时间 [+ CPU运算时间 + 数据传输时间(不考虑远程访问) ]
  一般,查询代价指 **磁盘块传送数量** 作为实际代价的度量,忽略写操作的代价

2.2 查询处理过程概述

    01 SQL语句
    02 语法分析(语法树)  --> 查询编译(至05)
    03 初始逻辑查询计划  --> 元数据 统计数据(至05)
    04 优化逻辑查询计划
    05 创建并优化物理查询计划
    06 查询执行引擎  --> 数据
    07 查询结果
    参考视频实例
    选定“叶子”关系表输入(扫描)策略。//由上一层关系实现算法确定
    选定实现“非叶子”节点操作的算法细节和中间结果的保存形式。
    确定各种物理操作执行顺序。

2.3 关系操作的基础算法

主要有三类:基于排序、散列、索引的算法
根据数据规模(等同难度):有一趟、两趟、三趟算法。

2.3.1 一趟算法

  一趟算法只读一次文件。对于二元操作需要至少有一个可以全部读入内存。
  搜索代价为文件占磁盘块数。
  方法:选择σ和投影π运算——一次多个元组;消除重复δ和分组γ——一次一个关系。

2.3.2 两趟算法

  标准内存排序算法:二路归并算法,一般推广为N路归并算法
  代价 = {Br*2log[M]Br} ::关系r所包含的磁盘块数Br, 缓存区用于输入的磁盘块数M。 2表示读入+读出,NlogN是归并排序的复杂度。
  如果M=2,每块容纳2个记录,Br对应6块,则需要36次块传送
  利用散列函数对关系进行划分,生成N[h]个散列桶
  读取操作所需的桶内数据,实现指定操作
划分代价:2Br (读入读出)
当关系非常大时,要进行递归划分,直到满足 M > (Br/M)+1 。 每趟将分区大小减少为原来1/M,则划分趟数为 log[M]Br - 1 ,结合上式,递归划分代价为 2Br*趟数
整体代价 = 划分代价 + 分区读入 = 3Br

2.4 查询表达式的运算

  过程:从树的最底层开始,输入关系利用前面算法执行运算,并将结果保存到临时关系中作为高一层和输入
  代价:所有运算代价和 + 把中间结果写回磁盘的代价
  所以需要估计中间结果的大小, 具体估算略。
    将运算组成流水线,一个运算结果传送到下一个运算,从而去除读写临时关系的代价。
    通过系统中的进程或线程建模,从流水话的输入中接受元组流,并产生一个元组流输出。
    对流水线中每一相邻操作,均创建缓冲区保存上一操作输出的元组。
    缺点:各操作间数据的依懒性较强。
    解决方法:需求驱动;生产者驱动
    对算法有限制:索引嵌套循环,但归并连接不能用;比实体化方法代价高,因此实体化方法更容易接受,可采用双缓冲技术提高实体化方法效率

2.5 查询优化机制

    从众多查询策略中找出最有效的查询执行计划的一种处理过程。
    查询优化的过程:逻辑层次(关系代数等价变换),物理层次
    关系表达式的等价变换:启发式算法,选择较小代价的变换(把选择运算尽量推到叶子方向;把投影运算尽量推向叶子方向;利用统计信息确定哪些运算会产生最小的关系)
    物理查询计划的选择:为每个操作符确定算法;流水线的识别;运算次序的确定(枚举技术)

所以不要写太复杂的查询语句

2.6 appendix


第三讲 数据管理与恢复技术

要求熟悉UNDO、REDO和UNDO/REDO三种日志类型的特点,掌握系统故障时,系统使用不同日志类型恢复数据库的算法。能够针对不同日志类型特点,编写利用日志文件恢复数据库的算法。

3.1 数据库的故障恢复

3.2 事务与日志的概念

事务 Transaction:访问数据库的一个逻辑单位,由若干查询或更新数据的语句进行。
事务的特点 ACID:原子性, 一致性, 隔离性, 持久性
事务的状态:活动状态--最后一个语句--提交状态(失败状态--终止状态)
事务管理器的工作原理:

技术分享图片

用于记录日志的重要事务原语:事务与数据库交互的三个重要地址空间:

    01 磁盘块空间
    02 缓冲区管理所管理的主存地址或虚存地址
    03 事务的局部地址空间(变量t)
    01 --> INPUT --> 02 --> READ --> 03t
    03t --> WRITE --> 02 --> OUTPUT --> 01

主要关心磁盘的变化,也就是input和output过程
日志:日志记录操作的序列;对于数据库来说,日志记录每个事务每个步骤执行及其效果,一个日志可以记录多个事务的执行情况。
刷新日志记录命令(FLUSH LOG):使当前缓冲区的日志记录“强制性”写入磁盘。
日志包含的元素:

<START T> 
<COMMIT T>
<ABORT T> 
<T2,Update,A,100,200> 
Checkpoint(检查点记录)

3.3 基于日志的恢复机制

常用三种日志类型:undo日志、redo日志、undo/redo日志

undo日志及其恢复机制

01 在某些事务开始时,写日志<START CKPT(T1,...Tk)>,并刷新日志FLUSH LOG
02 等待事务的提交或终止,在此期间可以有其他事务Tj开始
03 当T1...Tk提交或终止后,写<End CKPT(T1, Tk)>,并刷新日志FLUSH LOG
第一步,从故障点开始,逆向扫描日志文件,确定故障发生时没有完成的事务。
第二步,恢复操作沿着逆向扫描日志方向,恢复原值
注:逆向扫描时,先遇到END CKPT时,扫描至START CKPT,撤销没有提交的事务;先遇到START CKPT时,扫描至前一个START CKPT,撤销没有提交的事务。

redo日志进行恢复

为了减少I/O操作,等缓冲区较满时,保存到磁盘中
日志记录格式:<T, op, x, w> w表示x更新后的新值。
**创建redo日志的规则**:
    (更新数据时)写日志-->写数据
    (提交事务前)写<COMMIT T> --> 写数据
    01 写日志记录<START CKPT(T1,...Tk)>,并刷新日志FLUSH LOG
    02 在写<START CKPT(T1,...Tk)>前,缓冲区中所有已经提交、但未写入磁盘的数据库操作,完成写盘操作。
    03 写<End CKPT(T1, Tk)>,并刷新日志FLUSH LOG
    注:redo日志的事务可能跨越多个检查点!!

undo/redo日志进行恢复

    (更新数据时)写日志-->写数据
    (提交事务前)之前或之后
    写START CKPT(T1,...Tk),并FLUSH LOG
    把所有缓冲区的更新数据,写入磁盘
    写入END CKPT,并FLUSH LOG

3.4 Appendix


第四讲 事务并发调度的相关概念

4.1 并发及相关概念

4.2 可串行化调度

4.3 冲突可串行化调度


第五讲 基于封锁的并发控制机制

5.1 锁的概念及封锁的原理

5.2 两阶段锁协议

5.3 多粒度锁及意向锁

5.4 死锁的处理

第六讲 并发控制的其他机制

6.1 基于时间戳的调度

6.2 基于有效性检验的调度

技术分享图片
技术分享图片


第七讲 分布式数据库基本概念

7.1 分布式数据库的产生及定义

7.2 分布式数据库系统的模式结构与功能

技术分享图片

除了具有集中式DBMS具有的功能外,还附加如下功能:数据追踪;分布式查询处理的能力;分布式事务管理的能力;复制数据的能力;安全性;分布式目录管理

7.3 分布式数据库系统中存在的技术问题

设计(全局模式的设计, 数据分片,分布);查询处理(全局查询的分解锁定);事务管理及并发控制;可靠性(结构有关);异构数据库的连接;安全性(数据、网络);目录管理

7.4 Appendix

第八讲 分布式数据库的设计

8.1 分布式数据库的设计方法、内容和目标

根据设计是基于现存的数据系统还是构造一个全新的数据库系统,有两种方法创建分布式数据库:

组合法:基于现有系统,建立一个协调管理系统(采用自底向上的方式构建
重构法:创建全新的数据库系统,采用自顶向下的方式构建

8.2 自顶向下方法构建数据库

技术分享图片

8.3 数据的分片和分布设计

8.4 分布式数据库设计实例

最频繁的20%的应用,覆盖80%的数据访问。
详见视频实例。


第九讲 分布式数据库查询机制

要点:理解分布式数据库查询优化步骤,并与集中式数据库查询优化比较;理解利用半连接算法实现直接连接运算的全局查询优化方法特点,半连接算法和直接连接算法的代价比较。

9.1 分布式查询处理的步骤和代价

9.2 基于等价变换的查询优化

9.3 基于半连接算法的查询优化

技术分享图片

9.4 基于直接连接算法的查询优化

利用站点依赖信息的连接算法

技术分享图片

分片和复制算法

当查询不能再无数据传递方式下处理,可采用分片和复制算法

第十讲 分布式数据库的事务管理及恢复机制

10.1 分布式事务概述

技术分享图片

# 全局应用事务  --> 转成代理
read(@AMOUNT, @FROM_ACC, @TO_ACC);
begin transaction
select BALANCE into @FROM_AMOUNT
    from ACCOUNT_TABLE
    where ACCOUNT_NO = @FROM_ACC;
if @FROM_AMOUNT - @AMOUNT < 0
then abort
else begin
    update ACCOUNT_TABLE
    set BALANCE = BALANCE - @AMOUNT
        where ACCOUNT_NO = @FROM_ACC;
    update ACCOUNT_TABLE
    set BALANCE = BALANCE + @AMOUNT
        where ACCOUNT_NO = @TO_ACC;
    commit
end
# ROOT_AGENT
read(@AMOUNT, @FROM_ACC, @TO_ACC);
begin transaction
select BALANCE into @FROM_AMOUNT
    from ACCOUNT_TABLE
    where ACCOUNT_NO = @FROM_ACC;
if @FROM_AMOUNT - @AMOUNT < 0
then abort
else begin
    update ACCOUNT_TABLE
    set BALANCE = BALANCE - @AMOUNT
        where ACCOUNT_NO = @FROM_ACC;
>>>>>>>>>>>>>>>>>>>
    creat AGENT
    send to AGENT(@AMOUNT, @TO_ACC);
    waitting
    commit/abort
<<<<<<<<<<<<<<<<<<<
end
# AGENT
begin transaction
receive from ROOT_AGENT(@AMOUNT, @TO_ACC);
update ACCOUNT_TABLE
set BALANCE = BALANCE + @AMOUNT
    where ACCOUNT_NO = @TO_ACC;
send to ROOT_AGENT(‘SUCCESS‘ / ‘FAIL‘)
waitting
commit/abort
end

10.2 分布式事务的两阶段提交协议

2-PC:Two-Phase Commitment Protocal

技术分享图片

10.3 分布式并发控制概述

10.4 并发控制的加锁机制

10.5 并发控制的时标技术

原文:https://www.cnblogs.com/StupiDeMon/p/10181684.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!