《数据库程序员面试分类真题4.docx》由会员分享,可在线阅读,更多相关《数据库程序员面试分类真题4.docx(17页珍藏版)》请在优知文库上搜索。
1、数据库程序员面试分类真题4筒答题1. 什么是反范式?反范式有什么优缺点?正确答案:数据库设计要严格遵守范式,这样设计出来的数据库,虽然思路很清晰,结构也很合理,但是,有时候却要在一定程度上打破范式(江南博哥)设计。因为范式越高,设计出来的表可能越多,关系可能越复杂,但是性能却不一定会很好,因为表一多,就增加了关联性。特别是在高可用的O1.TP数据库中,这一点表现得很明显,所以就引入了反范式。不满足范式的模型,就是反范式模型。反范式与范式所要求的正好相反,在反范式的设计模式中,可以允许适当的数据冗余,用这个冗余可以缩短查询获取数据的时间。反范式其本质上就是用空间来换取时间,把数据冗余在多个表中,
2、当查询时就可以减少或者避免表之间的关联。反范式技术也可以称为反规范化技术。反范式的优点:减少了数据库咨询时表之间的连接次数,可以更好地利用索引进行筛选和排序,从而减少了I/O数据量,提高了查询效率。反范式的缺点:数据存在重复和冗余,存在部分空间浪费.另外,为了保持数据的一致性,必须维护这部分冗余数据,因此增加了维护的复杂性。所以,在进行范式设计时,要在数据一致性与查询之间找到平衡点,因为符合业务场景的设计才是好的设计。范式和反范式的对比见下衣。模型优点缺点鸟式化模数据没有冗余,更新容易当表的数量比较多,查询设计需要很多关联模型(Join)时,会导致查询性能低下需要维护冗余数据,从目前NoSQ1
3、.的发展可以看到,对磁盘空间的消耗是11r以接受的数据冗余将带来很好的读取性能反范式化(因为不需要关联很模型多表,而且通常反范式模型很少做更新操作)考点反范式2. 常见的数据库反范式技术有哪些?正确答案:在RDBMS模型设计过程中,常常使用范式来约束模型,但在N。SQ1.模型中则大量采用反范式。常见的数据库反范式技术包括:1)增加冗余列。在多个表中保留相同的列,以减少表连接的次数。冗余法以空间换取时间,把数据冗余在多个表中,当查询时可以减少或者避免表之间的关联。2)增加派生列。表中增加可以由本表或其他表中数据计算生成的列,减少雀询时的连接操作并避免计兑或使用集合函数。3)表水平分割。根据一列或
4、多列的值将数据放到多个独立的表中,主要用于表的规模很大、表中数据相对独立或数据需要存放到多个介质的情况。4)表垂直分割。对表按列进行分割,将主键和一部分列放到一个表中,主键与其他列放到另一个表中,在查询时减少I/O次数。例如,有学生表与课程表,假定课程表要经常被查询,而且在查询中要显示学生的姓名,则查询语句为SE1.ECTCODE,NAME,SUBJECTI-ROMCOURSEC,STUDENTSWHERES.ID=C.CODEWHERECODE=?如果这个语句被大范围、高频率地执行,那么可能会因为表关联造成定程度的影响,现在,评估到学生改名的需求是非常少的,那么,就可以把学生姓名冗余到课程表
5、中。注意:这里并没有省略学生表,只不过是把学生姓名冗余在了课程表中,如果万一有很少的改名需求,只要保证在课程表中改名正确即可。那么,修改以后的语句11J以简化为SE1.ECTCODE,NAME,SUBJECTFROMCOURSECWHERECODE=?考点反范式3. 事务可以分为哪几类?正确答窠:从事务理论的角度来看,可以把事务分为以下几种类型:1)扁平事务(FIatTransactions)o2)带有保存点的扁平事务(FIatTransactionswithSavepoints)o3)链事务(ChainedTransactions)o4)嵌套事务(NeStedTransactions)05)
6、分布式事务(DiStribUtedTransactions)0考点分类4. 什么是XA事务?正确答案:XA(extendedArehiteCtUre)是指由X0pen组织提出的分布式交易处理的规范。XA是一个分布式事务协议,由TUXedo提出,所以,分布式事务也称为XA事务。XA协议主要定义了事务管理器(TranSaCtionManager,TM,协调者)和资源管理器(RCSoUrCCManager,RM,参与者)之间的接口。其中,资源管理器往往由数据库实现,例如OraCIe、DB2、MySQ1.,这些商业数据库都实现了XA接口,而事务管理器作为全局的调度者,负责各个本地资源的提交和回滚。XA
7、事务是基于两阶段提交(TWo-PhaSeCommit,2PC)协议实现的,可以保证数据的强一致性,许多分布式关系型数据管理系统都采用此协议来完成分布式。阶段一为准备阶段,即所有的参与者准备执行事务并锁住需要的资源。当参与者准备好时,向TM汇报自己已经准备好。阶段二为提交阶段。当Tv确认所有参与者都准备好后,向所有参与者发送COMMlT命令。XA事务允许不同数据库的分布式事务,只要参与在全局事务中的每个节点都支持XA事务。Oracle.MySQ1.和SQ1.Server都支持XA事务。XA事务由一个或多个资源管理器(RV)、一个事务管理器(TM)以及一个应用程序(APPliCationPrOgr
8、am)组成。1)资源管理器:提供访问事务资源的方法。通常一个数据库就是一个资源管理器。2)事务管理器:协调参与全局事务中的各个事务。需要和参与全局事务的所有资源管理器进行通信。3)应用程序:定义事务的边界。XA事务的缺点是性能不好,并且XA无法满足高并发场景。一个数据库的事务和多个数据库间的XA事务性能会相差很多。因此,要尽量避免XA事务,例如可以将数据写入本地,用高性能的消息系统分发数据,或使用数据库复制等技术。只有在其他办法都无法实现业务需求,且性能不是瓶颈时才使用XA.考点分类5. 脏读、不可重复读和幻读的区别是什么?正确答窠:当多个线程都开启事务操作数据库中的数据时,数据库系统要能进行
9、隔离操作,以保证各个线程获取数据的准确性,所以,刻于不同的事务,采用不同的隔离级别会有不同的结果。如果不考虑事务的隔离性,那么会发生下表所示的3种问题。观*R介举K速(DiflyRod)TM旗了啊TWHt改,但歌般的粼,当一外务疏缴融好醵,砧渺事务中多浦多政策E钻殴,这时另外T并发的$林丽读好册就会遇辆竹州到械邮T用户A翎户BHIK)O元腿SQ1.Mj吓:UPDATEACaWrSETMONEY=MoNEY+100WHERENAME=吩(AMAOB)UPDATEACCOUNTSETMONEY=MONEY-100WHERENAME=,A;当只佚厅第条SQ1.BtAieEB代看屋凡B发现留实三俄牌姓
10、避旗),毗,舐除二条SQ1.三r,只婀事务做交,所能僚硼解.驱号B以前嫡礴户版会发现麒不可篁复*(NcorepeatabkRod)在同务中洞一个好!在TlMEI游丽某一行,在TIME2时膨注照一行用机发现这T武敷景逑发生修改,可能被更靛了(Updne).6Imi(Dctae)事务Tl花谀富臬一教凯而卑务T2立即作改了这个数第并且败学做髀Hti丽喊剧KW了础的献,nmJSii幻灯(PhiniomRod.也收除幻厘鼠蜕)胡T务中,加-醐多城怖棉由刊“蟠入(IMat)蝮作的中务败,会明S耳姬目不刚斶桑第幻觎幅料!就丽发轴Tf稣,务Tl酚-忸中肺行般僮舸研了从T修改为丁的麟,酬步务T2又险忸悔入了一他
11、需IfiiifftWJftft屣T并改馈减电操作事务TlIIMP如就加瞬修Ii缄院舷会发SMT很施瓦K灿疗是糕务T2中触)的,或好11产拉授一反这i烧发生了麒脏读和不可重复读的区别:脏读必某一事务读取了另一个事务未提交的脏数据,而不可重复读则是在同一个事务范围内多次查询同一条数据却返回了不同的数据值,这是由于在查询间隔期间,该条数据被另i个事务修改并提交了。幻读和不可重且读的区别:幻读和不可重复读都是读取r另一个事务中已经提交的数据,不同的是不可重夏读查询的都是同一个数据项,而幻读针对的是一个数据整体(例如,数据的条数)。考点隔离级别6. 在SQ1.标准中定义的4种隔离级别分别是什么?正确答案
12、:在SQ1.标准中定义了4种隔离级别,每一种级别都规定了一个事务中所做的修改,哪些是在事务内和事务间可见的,哪些是不可见的。较低级别的隔离通常可以执行更高的并发,系统的开销也更低。SQ1.标准定义的4种隔离级别:ReadUnCOnImitted(未提交读)、ReadComnlitted(提交读)、RepeatableReae1(可重复读)、SeriaIiZabIe(可串行化),下面分别介绍。(I)ReadUnCommitted(未提交读,读取未提交内容)在该隔离级别,所有事务都可以看到其他未提交事务的执行结果,即在未提交读级别,事务中的修改,即使没有提交,对其他事务也都是可见的,该隔离级别很少
13、用于实际。读取未提交的数据,也被称为脏读。该隔离级别最低,并发性能高。(2)ReadlCOnImitted(提交读,读取提交内容)这是大多数数据库系统的默认隔离级别。它满足了隔离的箍单定义:一个事务只能看见已经提交事务所做的改变.换句话说,一个事务从开始直到提交之前,所做的任何修改对其他事务都是不11J见的。(3)RepeatableRead(可重复读)可重复读可以确保同一个事务,在多次读取同样的数据的时候,得到同样的结果。可重复读解决了脏读的问题,不过理论上,这会导致另一个棘手的问题:幻读。MySQ1.数据库中的InnoDB和Falcon存储引擎通过MVCC(Multi-VersionCon
14、currentControl,多版本并发控制)机制解决了该问题。需要注意的是,多版本只是解决不可重复读问题,而加上间隙锁(也就是它这里所谓的并发控制)才解诀了幻读问题。(4)SerialiZable(可串行化、序列化)这是最高的隔离级别,它通过强制事务排序,强制事务串行执行,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。实际应用中也很少用到这个隔离级别,只有在非常需要确保数据的一致性而且可以接受没有并发的情况下,才考虑用该级别。这是花拢代价最高但是最可靠的事务隔离级别。隔离Read级Uncommitted别在该隔离级
15、别,所有事务都可以看到其他未提交事务的执行结果,即在未提交读级别,事务中的黑修改,即使K没有提交,对其他事务也都是可见的,该隔离级别很少用于实际。读取未提交的数据,也被称为脏ReadCommitted这是大多数数据库系统的默认隔离级别。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。换句话说,一个事务从开始直到提交之前,所做的任何修改对其他事务都是不可见的。提交RepeatableReadSerializable可重复读可以确保同一个事务,在多次读取同样的数据的时候,得到同样的结果。可重复读解决了脏读的问题,不过理论上,这会导致另一个棘手的问题:幻读。这是最高的隔离级别,它通过强制事务排序,强制事务串行执行,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个MySQ1.数据库中的级别,可能导致大InnoDB量的超时和FaICon存储引现象和锁竞争。实读。该隔离级别最低,并发性能高读是OraCle数据库默认的事务隔离级别挈通过MVCC(多版本并发控制)机制解决了该问题。需要注意的是,多版本只是解决不可重复读问题,而加上间隙锁(也就是所谓的并发控制)才解决了幻读问题。可重复读是MySQ1.数据库的默认隔离级别际应用中也很少用到这个隔高级别,只有在非常需要确