华南理工大学《数据库》(研究生)复习题1.基于锁的协议有几种?什么是基于时间标签的协议?什么是基于验证的协议?基于锁的协议即两段锁协议,是指指所有事务必须分两个阶段对数据项加锁和解锁。
具体又分为:基本2PL、保守2PL 、严格2PL和精确2PL基于时间标签的协议:事务被施加了一个基于时间戳的顺序要求并发控制器检查事务对每个DB对象的读写请求看是否能遵循基于时间戳的串行顺序。
以上这个原则性要求,可具体表达为:对任两事务Ti和Tj,若Ti先于Tj,即TS(Ti)<TS(Tj),则必须确保在执行期间,当事务Ti的动作ai与Tj的动作aj冲突时,总有ai先于aj。
如果有某个动作违反了这个串行顺序原则,则相关事务就必须被中止撤销。
每个事务开始启动时,要附上一个时间标记(timestamp)。
后启动事务的标记值大于先启动事务的标记值。
对每个数据库数据项Q,要设置两个时间标记:读时间标记tr,表示成功读过该数据的所有事务的时间标记的最大值。
写时间标记tw:表示成功写过该数据的所有事务的时间标记的最大值。
基于验证的协议:基于验证是一种基于优化的并发控制,允许事务不经过封锁直接访问数据,并在“适当的时候”检查事务是否以可串行化的方式运转(这个“适当时候”主要指事务开始写DB对象之前的、一个称被为“有效确认”的、很短的瞬间阶段)。
事务T的执行过程分为三个阶段:读阶段:事务正常执行所有操作,此时数据修改放在局部临时变量中而不更新数据库。
检验阶段:进行有效性检查,T和已经比它先提交的事务进行比较,发现是否有冲突。
写阶段:如果检验阶段发现无冲突,则事务提交,否则卷回T。
每个事务T的三个阶段对应三个时间标签:start(T):开始执行时间validation(T):开始进入验证的时间finish(T):完成写阶段的时间注意:(1)不同的事务的三个阶段可以交叉执行,但三个阶段的顺序不能改变。
(2)事务最终执行的调度顺序是按照事务的进入验证的时间标签来排。
2.处理死锁的方法有哪些?处理死锁的两种基本方法:预防法和检测法。
预防法:TB已对某数据对象加锁,而TA对该数据对象申请加锁时,选择某事务卷回重执,避免死锁出现。
卷回策略分为等待-死亡策略(若老则等年轻,若年轻则卷回)和击伤等待策略(若年轻则等老,若老则年轻卷回)检测法:基于等待图。
每个活跃事务对应图中的一个节点,如果事务Ti正等待事务Tj 所持有的某个锁,则有一条从Ti对应节点指向Tj对应节点的边。
它可清晰表达事务等待其它事务持有锁的情况。
封锁管理器通过维护等待图来检测死锁循环。
3.什么是多版本并发控制技术?定义:这种技术维护同一数据项的多个版本,把正确的版本分配给事务的读操作。
与其他技术不同的是,这种技术从不拒绝读操作。
目标:事务只读DB元素时无需等待方法:维护最近被修改对象的多个版本(每个版本都带有一个写时间戳),当读事务T 到来时,让它读TS(T)之前的最近的版本。
4.什么是数据锁转换?什么是锁升级?数据锁转换(lock conversion):是指在特定的条件下,允许已经对数据项X持有锁的事务把锁从一种锁定状态变换到另一种状态。
Oracle会尽可能在最低级别锁定(即限制最少的锁),如果必要,会把这个锁转换为一个更受限的级别。
锁升级(lock escalation):是指处于同一粒度级别上的锁被数据库升级为更高粒度级别上的锁。
举例来说,数据库系统可以把一个表的100个行级锁变成一个表级锁,但可能会锁住以前没有锁定的大量数据。
如果数据库认为锁是一种稀有资源,而且想避免锁的开销,这些数据库就会频繁使用锁升级。
Oracle数据库中不存在锁升级。
锁升级将会显著地增加死锁的可能性5.什么是延迟更新与即时更新?延迟更新是指所有事务的更新都记录在局部事务的工作区(或缓存区),只有在事务到达提交点后才真正更新磁盘上的数据库。
如果事务在提交前失败,则它不会修改数据库。
即时更新是指更新一旦发生就被施加到数据库,而无需等待到提交时刻。
若事务的某些操作达到提交点前被写入数据库,恢复时需要UNDO/REDO;如果事务在达到提交点前所有的更新已被写入数据库,需要算法UNDO/NO-REDO6.什么是原位更新和镜像更新?将修改过的缓冲区刷新到磁盘,有两种策略原位更新(in-place update):将缓冲区写回磁盘原来的位置,因而会覆盖被修改数据项在磁盘上的旧值,基于原位更新的恢复必须使用日志。
镜像更新(Shadow update):将缓冲区写到磁盘不同的位置,可保存数据项的多个版本。
7.理解用日志进行恢复的过程。
一种日志是把写操作记录下来:1.当事务Ti开始时,Ti先在日志文件中写入如下的记录:<Ti start>2.当Ti对记录X执行写操作write(X)时,首先写入日志记录<Ti, X, V1, V2>, 其中V1是旧值,V2是新值3.当Ti结束最后一条语句时,写入<Ti commit>的日志记录4.这里可以先假设日志记录是不经过缓存直接写到稳定的存储介质上的。
另外一种日志形式中,把上述X取为一个物理块,则一个日志记录包含了如下三部分:1. 前像(Before Image):当一个事务更新数据时,所涉及的物理块在更新前的映像称为该事务的前像,可以据此使数据库恢复到更新前的状态(撤消更新undo)。
2 .后像(After Image)当一个事务更新数据时,所涉及的物理块在更新后的映像称为该事务的后像,可以据此使数据库恢复到更新后的状态(重做redo)。
3 .事务状态成功(committed)/失败(rollback,abort);辅助的结构有活动事务表和提交事务表WAL规则(The Write-Ahead Logging Protocol)1. 先写日志:更新时先写日志再把数据写到磁盘(保证原子性)2.在事务提交前写事务相关的所有日志记录到稳定存储介质(保证持久性)日志恢复例子恢复例子:撤消阶段(Undo Phase)恢复例子:重做阶段(Redo Phrase)8.什么是潜入/非潜入和强制/非强制?潜入/非潜入和强制/非强制确定了何时把数据页从高速缓存写回磁盘潜入(Steal):缓存中的数据可在事务提交前写回磁盘非潜入(No-Steal): 缓存中的数据不能在事务提交前写回磁盘强制(Force): 缓存中的数据在事务提交后直接写回磁盘(强制地)非强制(No-Force): 即使修改过的内存块没被写回磁盘,事务也可以提交(因为重做的信息已记录在日志中)。
9.理解ARIES恢复管理算法(PDF db04 page30)ARIES简介:它试图以概念上相对简单且系统化的方式,提供一套能确保事务原子性和持性的、具有良好性能的恢复管理算法。
它能与绝大多数并发控制机制很好协调工作的。
这里使用并发封锁控制默认时都假定使用基于strict-2PL协议的封锁调度器,并假设主要基于页级封锁。
少数场合,如逻辑日志中,也可能涉及元组级封锁。
算法流程:采用基于“steal/no-force”工作模式。
当系统崩溃后重启时,恢复管理器将被激活,并按以下三个阶段进行处理:分析(Analysis):鉴别崩溃发生时,缓冲区中的脏页和当时仍活跃的事务。
重做(Redo):重做从日志的适当起点(比如,被修改的最早脏页对应日志记录)开始的所有动作,恢复系统到崩溃时的DB状态。
撤消(Undo):撤消上次崩溃时所有未提交事务的动作效果,使DB只反映已提交事务的影响。
(建议看下PDF db04 p33-38的例子加深理解)10.性能调整的系统的方法有哪些?优化器做些什么?调优通常涉及哪些问题?性能调整的系统的方法有:(1)正确地设计应用程序(2)调整应用程序的SQL代码(3)调整内存(4)调整I/O(5)调整争用和其他问题优化器做的事情是:1. SQL 转换2. 选择访问路径3. 选择连接方法4. 选择连接顺序调优涉及的问题:•如何避免对锁的争用,从而增加事务之间的并发性•如何最小化日志开销,以及不必要的数据转储•如何优化缓存区的大小,以及进程的进度•如何对磁盘、RAM和进程之类的资源进行分配使其利用效率最高•这些问题大都可以通过设置合适的物理DBMS参数、改变设备的配置、修改操作系统的参数参数、改变设备的配置、修改操作系统的参数和其他类似的动作得以解决。
11.什么情况下进行索引的调优?怎么进行索引的调优?基于以下几个原因需要对索引进行调优:(1)由于缺乏索引,某些查询的执行时间过长(2)某些索引自始自终没有被使用(3)某些索引建立在被频繁改变的属性上导致系统的¾某些索引建立在被频繁改变的属性上,导致系统的开销过大怎样进行索引调优:•借助于相关工具,DBA 可从系统获得关于查询执行过程的信息,通过分析执行计划,可以得到产生上述问题的原因基于调优分析可得到产生上述问题的原因,基于调优分析,可能会删除某些索引,也可能要增加新的索引。
•通过重建索引也可以改进系统的性能12.如何考虑数据库设计的调优?• 如果由于需要频繁使用两个或多个表中的某些属性,可能需要逆规范化现有的表• 必要的时候对表进行垂直划分.(垂直划分,即按照功能划分,把数据分别放到不同的数据库和服务器)• 必要的时候对表进行水平划分.(水平划分,,即把一个表的数据划分到不同的数据库,两个数据库的表结构一样。
怎么划分,应该根据一定的规则,可以根据数据的产生者来做引导,上面的数据是由人产生的,可以根据人的id来划分数据库。
然后再根据一定的规则,先获知数据在哪个数据库)13.了解查询的调优的原则和方法?需要进行查询调优的典型情况(1)查询导致过多的磁盘存取(比如一个精确的匹配查询要对整个表进行扫描) 整个表进行扫描)(2)查询计划表明相关的索引并没有被使用查询的调优的原则和方法(1)有些DISTINCT 是多余的,在不改变查询结果的前提下可以省略(2)把多个查询合并为一个查询,可避免使用不必要的临时结果表(3)FROM子句中表的出现顺序可能会影响连接操作(4)某些查询优化器在嵌套查询上的性能要比等价的非嵌套查询差(5)如果选择条件通过OR连接,可能优化器不会使用任何索引(6把NOT条件转化为肯定表达式(7)可用连接替换使用IN、=ALL、=ANY、=SOME的嵌入式SELECT块(8)可以使用多个列上的索引重写WHERE条件(PDF db05 25-29页很多原则,百度出来的结果也有三十多条,这里我主要列了其中一些比较简单字数少的规则)14.结合oracle体系结构,理解oracle调优的方法.(通知该题不用整理)15.什么是数据库集群?为什么要研究数据库集群?数据库集群分类有哪些?数据库集群技术的实现机理?提高处理速度的办法?提高可用性的方法?主流产品有哪些?数据库集群技术现状及前景。