ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 环球市场面试技术总结

环球市场面试技术总结

原创 Linux操作系统 作者:痞子_DBA 时间:2012-03-31 17:47:46 0 删除 编辑

到广州找工作已经10多天了,面试的公司也上10家了,说顺利也顺利说不顺利也不是顺利,因为到现在自己还没找到自己满意的工作,要不就是工资不满意或者平台不满意,然后到昨天才发现自己在这10多天的过程中技术基础已经抛之脑后了,一想oracle已经大半个月没有碰过了,这就造就了昨天的机遇错过!!!!痛恨!!!下面是面试时的几个技术问题,我答的不好,所以现在回家总结!!!!

1.简述下update的过程

(1)将要被操作的记录对应的数据块读入缓存准备修改

(2)到undo空间某回滚段中申请回滚块,并将申请到的回滚块信息(记录下事务ID、事务所占回滚块地址等)记录在回滚段头中,此时由于需要修改undo段头块中信息,所以必须先生成一条改动向量记入日志缓存(change#1)。

(3)修改数据块的数据之前,先将其前映像保留在undo空间中刚申请到的回滚块中。而此时,由于又需要修改回滚块中信息,因此又必须先产生日志,生成一条改动向量记入日志缓存(change#2)。

(4)修改数据块,将后映像(即新数据)写入该数据块,因此这次需要修改数据块中内容,还是必须得先产生日志的改动向量(change#3)

(5)commit提交时,会产生第二个重做记录,该重做记录只有一个改动向量:用来记录对回滚段事务表的更改(更新事务表中记录的该事务的状态)。

因此一条commit后的update语句,将产生两个重做记录,4条改动向量!步骤具体细化为:

目标数据库读入缓存---->申请undo块----->产生change#1----->修改undo段头块中信息---->产生change#2---->保存前映像到申请到的undo块----->产生change#3----->保存后映像到undo块----->commit------->产生第2条重做记录

2.B tree索引与BitMap索引的核心区别

我自己回答的是算法上有区别以及应用上的区别:B tree是采用平衡树算法,而位图索引采用的是bitand算法。位图索引只适用于表很大且索引列上值得种类很少即重复值较多,如性别!而且在表上放置单独的位图索引是没有任何意义的,只有许多列具有位图索引且用户常用这些列进行复合查询或group by查询时才能有效的利用位图索引。位图索引不适合大DML操作,如性别,当你修改某个女性值F时,F真值记录将被锁定,即意味着所有女性记录全部不能再有其他并发DML操作。由于该回答不过关,故自己在网上查询到如下自认为解释的不错的文章:

Oracle的索引主要包含两类:BTree和位图索引。默认情况下大多使用Btree索引,该索引就是通常所见 唯一索引、聚簇索引等等,Btree用在OLTP(联机事务处理系统),加快查询速度。位图索引是Oracle的比较引人注目的地方,其主要用在OLAP(联机数据分析)方面,也就是数据仓库方面用到,目的是在加快查询速度是,节省存储空间。通常情况下,索引都要耗费比较大的存储空间,位图采用了压缩技术实现磁盘空间缩减。Btree用在高基数(即列的数据相异度大),位图用在低基数列。位图索引的基本原理是在索引中使用位图而不是列值。通常在事实表和维表的键之间有很低的集的势(cardinality),使用位图索引,存储更为有效,与B*Tree索引比较起来,只需要更少的存储空间,这样每次读取可以读到更多的记录,而且与B*Tree索引相比,位图索引将比较,连接和聚集都变成了位算术运算,大大减少了运行时间,从而得到性能上的极大的提升。

在Oracle中如何合理的使用位图索引?以下的几个事项应该考虑。
  
           *  如果要使用位图索引,初始化参数STAR_TRANSFORMATION_ENABLED应该设置为
              TRUE.
           *   优化模式应该是CBO。对于数据仓库的环境中,总是应该考虑使用CBO(COST-BASED   
             OPTIMIZER)。
           *   位图索引应该建立在每一个事实表的外键列上。(这只是一个一般的规则.)
  
      此外,对于数据表中的cardinality如何客观的确定也是一个问题,一万条数据中只包含3个值的集和算是低的了,那么一亿条记录中包含3万条记录算不算低的呢?对于这样的情况,建议几行一下数据的模拟测试,一般来说,在数据仓库环境中,位图索引的性能要好于B*Tree索引。还要注意位图索引不是为OLTP数据库设计的,不应该在OLTP数据库中大量的使用它,尤其是对那些有更新操作的表 。 

3.表之间的查询连接oracle有几种分类?

(1)笛卡尔积连接:两表之间无关联条件,逐行比对。

(2)NL嵌套循环连接:oracle从驱动表或外部表中(即较小结果集的表)中读取第一行,然后和内部表(较大结果集的表)中的所有数据逐条按连接条件进行比对,将匹配到的记录放到结果集中,然后oracle从外部表中读取下一行继续循环。====》基于COST的ORACLE优化器CBO会自动选择较小的表作为外表

====》在外表比较小且内表连接列上有唯一或高度可选的非唯一索引时,效率较高,否则效率不高。

(3)SMJ排序合并连接:在排序合并连接中,没有驱动表的概念,两个互相连接的表按连接列上的值先排序,排序完成后的结果集再互相进行合并连接提取符合条件的记录。

====》当缺乏数据的选择性或索引时,或者两个结果集都过于庞大(超过记录数的10%)时,排序合并连接比嵌套循环连接有效。

====》由于oracle中排序是很耗费资源的,因此当两个结果集很大时,排序合并连接的性能较差

(4)HASH连接:oracle先在内存中对较小的表上建立基于连接列的hash排序表,然后再扫描大表并检测内存中的小表是否有匹配的记录,是则记录到结果集中。

====》因为小表位于内存中搜索效率较高,而大表按索引扫描效率也高。股HASH连接适合小表和大表的连接

====》HASH连接适合内存充足的环境,当内存充足时,hash连接是oracle优化器通常选择。

====》hash连接仅适用于等值连接。且仅在HASH_JOIN_ENABLED=true、以及PGA_AGGREGATE_TARGET设置了足够大时,oracle才会选择HASH连接,且只有CBO才可用HASH连接

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26823568/viewspace-720088/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2012-03-26

  • 博文量
    31
  • 访问量
    59287