oracle几个面试题

来源:互联网 发布:中级程序员考证费用 编辑:程序博客网 时间:2024/04/30 23:55
题1、简单描述一下nest loop与hash join的差别。

答:sql语句的联接概念题。实训里有提到~

nest loop,貌似应该叫nested loop,就是循环嵌套,在联接时,oracle选择一张较小的表作为驱动表,每次选择其中的一行数据,然后和被驱动的表中的每一行做比较。这是最简单, 也最常用的一种联接方式。但是可以想到,这种联接的方式如果在两张表非常大的情况下是效率很低的。只要在驱动表中找到一行,就必须对被驱动表中进行一次全 表扫描,在没有index的情况下那将会有大量的读操作。当然,如果在联接的条件列有索引的话,那情况就会好得多。所以,nested loop主要还是用于比较小的表,或者特定列有索引的情况下使用。用小表做为驱动表也即是考虑到了索引的问题,nested loop的代价不就是驱动表中的行数×索引的代价值嘛。(这题是不是也就是对jj大神的联接加了索引以后速度就会快很多的一个解释呢?)

hash join(又见hash……其实o小白到现在对这个东西都不十分理解)的理论更加复杂一点。oracle首先也是选择一张小表,做成hash表后放到内存 的hash area中,这里可以理解为数据结构中的那个bucket,然后将大表的每一行的联接列做hash以后找到对应的bucket,然后具体匹配返回数据,那 这个联接成本就很低,也不要求索引,在内存足够大(能够容纳一张小表的hash表)的时候,这个效率相当于两个表的全表扫描的代价之和以及一些hash运 算(cpu代价)。

当然,也有可能内存不足以容下hash表,这种情况比较复杂。那就要将hash表分成几个分区(partition), 部分放在内存中,部分放在硬盘上。同样是对大表的联接列做hash以后去顶partition和bucket,如果partition是在内存中的,那就 和前面一样,否则的话就把该行在内存中以partition的方式保留起来,留待最后和硬盘上的partition进行匹配并返回数据。

那更恐怖的情况是一个partition放不下……那这种情况的话,如果内存中的匹配不上的话就必须再走一次硬盘,开销会非常大。

那说了这么多,hash join要总结的话就是不需要索引,在表比较大并且联接列不是索引列的时候相比nested loop来说性能会有优势,傻瓜地来说在数据仓库型的系统中用hashjoin总是没错的。

题2:db file sequential read与db file scattered read等待的差别,如果以上等待比较多,证明了什么问题?

答:这题是考OWI(Oracle Wait Interface)吧,之前我的数据库的简单监控里有吧~这里就针对这两个东西来解释一下。

db file sequential read,中文过来么就是顺序读,如果顺序读比较多那代表是什么呢?简单来说就是频繁走了索引,连续读取索引而引起的事件,如果这个事件的等待比较多,那 就说明可能是索引建得有问题,可能是类型方面的问题,也有可能是在不该使用索引的地方建了索引。当然,有的时候在做数据分析的时候这个事件多也是合理的。

相 对的,db file scattered read则是指随机读过多。就像上面一道题说的,如果是nested loop表比较大而没有索引的话,那可能会看到这个等待事件,通常发生在全表扫描的时候。如果这个等待比较多的话呢,那可能需要考虑建索引来加快响应的速 度和效率了。

关于Wait Event,也有得说了,这里o小白就再次挖下一个坑……(怎么感觉有人想把我给埋了……)


题3:library cache pin与library cache lock是什么地方的等待事件,一般说明什么问题?

答:有关于pin和在数据库的简单监控一文中也有提到过咯!这里发个链接~

http://oxiaobai.blog.51cto.com/3369332/622991

那这里的也已经大致说明了这两个东西的概念。如果用户需要对一个对象做频繁的操作的话那就会出现这样的等待事件,比如对包的编译啊,对视图的操作啊,总之就是大量或者错误的ddl语句导致对象的失效啊。

 

题4:在一个24*7的应用上,需要把一个访问量很大的1000万以上数据级别的表的普通索引(a,b)修改成唯一约束(a,b,c),你一般会选择怎么做,请说出具体的操作步骤与语句。

答:这个题目也很有意思,大概是考了约束和索引的关系和建立约束和索引的几个小点。

最后一个论坛大侠给出了答案:

create index idx_test on test(a,b,c) online;这里能学到的是online,用这个online短语的话使得在建立索引的过程中不影响对表DML,那在实际应用中肯定是实用的。

然 后就是alter table test add constraint cons_test unique (a,b,c) using index idx_test;那这里能学到的就是using index,o小白之前是一点也不知道,只知道创建唯一约束的时候会自动创建索引,现在才知道可以自己建索引并且可以指定,那这样的话就可以指定 index了,以后对index的管理也会方便许多。


原创粉丝点击