ITPub博客

首页 > Linux操作系统 > Linux操作系统 > ORACLE题目(原创小结)

ORACLE题目(原创小结)

原创 Linux操作系统 作者:q418441117 时间:2012-10-25 15:41:11 0 删除 编辑

1.为什么说OLTP必须要求变量绑定而OLAP不应该绑定变量
1)OLTP系统中,SQL语句大多是比较简单活操作的结果集都很小。使用绑定变量,可以减少硬解析的次数,提高内存效率。而不使用绑定变量,会使OLTP系统资源被SQL解析严重消耗,系统会显得缓慢。当一个数据库有成千上万或者更多的用户同时执行这样的SQL,而ORACLE只做一次硬分析,之后只对每个SQL做执行操作,那必将极大地减轻数据库资源开销。
2)OLAP系统完全没有必要绑定变量,那样只会带来负面的影响,比如导致SQL选择了错误的执行计划,这个代价有时候是灾难性的,让ORACLE对每条SQL做硬分析,确切地知道谓词条件的值,这对执行计划的选择至关重要,这样做的原因是,在OLAP系统中,SQL硬分析的代价是可以忽略的,系统的资源基本上是用做大的SQL查询,和查询比较起来,SQL解析消耗的资源显得微不足道。所以得到一个最优的执行计划变得尤为重要。

2.介绍下B树索引和位图索引,(重点位图索引)
B树索引通常使用在重复值低的列上。在B树索引中,每个索引键值中都存储了一个行号(ROWID),通过这个行号,就可以非常方便地找到表中对应的记录,就像书的目录一样。而每一个位图索引的键值中,都会存放指向很多行的指针,而不是一行。这样位图索引存放的键值就会比B树索引少得多。由于位图索引的键值存放指向很多行的指针,在一个OLTP交易频繁的系统,并发非常大,这样会导致更新一行,会将对应的位图索引键值加锁。实际上,这个键值中包含了很多记录,比如1000条,如果此时另外的会话尝试去修改这1000条中的记录,这个操作就会被之前的操作阻塞。位图索引适合海量的OLAP或者数据长裤系统,并不适合OLTP系统。

3.数据库使用ORACLE 10.2.0.4,数据库字符集是AL32UTF8,客户端使用的是WINDOWS XP,字符集是ZHS16GBK。请问这时候要使用客户端SESSION连接数据库,客户端的nls_lang要设置成哪个字符集?简单说下理由。
nls_lang应该设置为ZHS16GBK,否则会出现乱码现象。原因是如果设置成ZHS16GBK,但数据库的字符是AL32UTF8,这时候客户端发出的命令,数据库就会进行字符转换,由AL32UTF8转换为ZHS16GBK,当客户端接受时字符就是ZHS16GBK,这时就可以正常显示。

4.解释下如下命令执行后再数据库都做了什么?sql>commit;  sql>alter system checkpoint; sql>ater system switch logfile;
1)sql>commit;提交完成,这个提示意味着Oracle已经将此时间点之前的Redo写入重做日志文件件,这个日志写完成之后,Oracle可以释放用户去执行其他任务。如果此后发生数据库崩溃,那么Oracle可以从重做日志文件中恢复这些提交过的数据,从而保证提交成功的数据不会丢失。
2)sql>alter system checkpoint; ckpt进程在更新控制文件和数据文件头的有关信息后,通知DBWn进程,产生一个检查点,在产生检查点的时候,DBWn进程会将buffer cache中的脏数据(当前online redo log对应的脏数据),写入我们的数据文件当中。那么这个时候如果数据库此时崩溃(比如我们做个shutdown abort),那么在进行实例恢复的时候就可以不需要当前online redo log的内容了,会很快就做完。因此ckpt进程只是个辅助进程,他的任务更多的是用来在系统做checkpoint的时候更新控制文件和数据文件头中的信息。
3)sql>ater system switch logfile; 一个就是在logfile switch的时候会触发arch进程,即通知归档进程说那个日志可以归档了。另一个是logfile switch的时候会触发ckpt进程。而ckpt进程又会触发dbwr进程。dbwr进程会把上一个redo中保护的储藏在buffer cache中的dirty buffer全部写回磁盘。然后,ckpt进程纪录scn到controlfile中,这时会把redo log的状态由active 变成inactive。

5.如果使用resetlogs进行数据库不完全恢复,resetlogs做了哪些工作?
1)所有的online logfile 的信息重新被放置在控制文件中。并且还要为有效的thread挑选一个logfile文件作为current logfile
2)log header被更新为log seq#
3)所有的online的数据文件头被新的checkpoint和新的‘resetlogs data’更新,offline的数据文件被标记为需要媒体恢复。

6.数据库归档模式下,全备份数据库后,增加了新表空间,数据库出现异常,需要使用全备份进行恢复。这时候需要做哪一步才能恢复新增表空间?
SQL> alter database rename file '+RAC_DISK/racdb/datafile/xhm.301.795003661' to '+rac_disk/racdb/datafile/XHM.302.795004969';

7.数据库丢失一组online redo logfile,经检查,丢失的这组状态为inactive,这时候我们该如何处理?
方法一:alter database clear logfile group 1;
方法二:可以先增加新的GROUP,再删除损坏的
SQL> alter database add logfile thread 1 group 5;
SQL> alter database drop logfile group 1;

8.insert,update,delete 什么操作一般会生成最多和最少的UNDO?简单说下理由。
一般来讲,insert生成的UNDO最少,因为ORACLE为此所需记录的只是要“删除”的一个ROWID。update一般排在第二(在大多数情况下),对于update,只需要记录修改的字节。你可能只更新了整个数据行中的很少一部分。delete生成的UNDO最多,对于delete,ORACLE必须把正行的前映像记录到UNDO段中。

9.描述tablespace和datafile之间的关系
tablespace是逻辑上的概念,datafile是物理上的概念。
一个tablespace可以由多个datafile组成,一个datafile不能跨越多个tablespace。

10.SGA主要有那些部分,主要作用是什么
db_cache(缓存数据块),log_buffer(控制重做日志缓冲区),shared_pool(缓存sql,执行计划,数据字典信息等),large_pool(MTS模式、parallel 、rman等要用到),java pool(java程序如SQLJ存储过程运行时要用到)

11.索引组织表(IOT)适用于哪些情况?
适用与经常会修改表里行数据的,比如有多个地址,人员信息会经常变更地址,这时候需要修改表。如果使用IOT,就可以把所有地址都放在一个BLOCK上,这样以后查询时可以减少BLOCK的一致读,提供性能。
适用与经常BETWEEN AND查询,IOT表可以使数据有序的存储,以减少读取的BLOCK。(如股票系统)

12.索引聚簇表适用哪些情况?
如果数据库主要用于读(这并不表示“从来不写”‘聚簇表完全可以修改),而且要通过索引来读(可以是聚簇键索引,也可以是聚簇表上的其他索引),另外会频繁地把这些信息联结在一起,此时聚簇就很适合。应该找出逻辑上相关而且总是一起使用的表,设计ORACLE数据字典的人就是这样做的,他们把与列相关的所有信息都聚簇在一起。

13.散列聚簇表适用哪些情况?
你很清楚表中会有多少行,或者你知道一个合理的上界。HASHKEY和SIZE参数的大小要正确,这对于避免聚簇重建至关重要。
经常按HASHKEY值访问数据。例如,假设有一个零件表,并按零件号来访问这些零件。查找表特别适合采用散列聚簇。

14.临时表有哪2种?
一种是基于事务的,当COMMIT后,临时表就被清空。另一种是基于会话的,当会话断开后,临时表才被清空。

15.锁(lock)和闩(latch)怎么区分的?
(1)都是锁
(2)latch锁比lock锁级别低
(3)lock用于database data,针对磁盘
(4)latch用于管理系统资源,针对内存,shared pool latch.
(5)library cache pin和library cache lock都是用于share pool的并发控制的。pin和lock都可以看作是一种锁。locks/pins会在SQL语句执行期间一直保持,在结束的时候才释放。
(6)大体上可以这样理解,现在要在一个房间里面修一张桌子。
shared pool latch保护你正常找到一个可以修桌子的空房间,
library cache lock保护你可以正常把桌子搬进房间,
library cache pin保护你可以正常在房间里把桌子修完。
(7)latch:It's called 锁存器, a register array for temporary keep the working status.oracle中文培训教材上翻译为栓锁,就是oracle的系统锁,进程只有获得latch才可以向db buffer cache里写入数据.闩,以区别与锁。闩是比锁低一级,或者说是用于系统内部的小型锁。latch是用于保证内存结构(如LRU List和Redo Allocation)在非常短的时间处在一致性的状态,一般不需要DBA的维护!
(8)lock是用于保证数据的一致性与更高的并发度的,包括TM表类型的lock和TX纪录类型的lock

16.B树索引认识
B树索引中不存在非唯一条目。在一个非唯一索引中,ORACLE会把ROWID作为一个额外的列(有一个长度字节)追加到键上,使得键唯一。例如,如果有一个CREATE INDEX I ON T(X,Y)索引,从概念上讲,它就是CREATE UNIQUE INDEX I ON (X,Y,ROWID)。在一个唯一索引中,根据你定义的唯一性,ORACLE不会再向索引键增加ROWID。在非唯一索引中,你会发现,数据会首先按索引键值排序(依索引键的顺序),然后按ROWID升序排序。而在唯一索引中,数据只按索引键值排序。

17.索引键压缩的认识
ORACLE会花更多的时间来处理这个索引结构中的数据,不光在修改期间维护索引更耗时,查询期间搜索索引叶更花时间。这里需要做的是对增加的CPU时间和减少的I/O时间作出权衡。利用压缩,块缓冲区缓存比以前能存放更多的索引条目,缓存命中率可能会上升,物理I/O应该下降,但是要多占用一些CPU时间来处理索引,还会增加块竞争的可能性。

18.为什么说位图索引只适合OLAP,不适合OLTP?
位图索引在读密集的环境中能很好地工作,但是对于写密集的环境则极不适用。原因在于,一个位图索引键条目指向多行。如果一个会话修改了又索引的数据,那么在大多数情况下,这个索引条目指向的所有行都会被锁定。ORACLE无法锁定一个位图索引条目中的单独一位,而是会锁定整个位图索引条目。倘若其他修改也需要更新同样的这个位图索引条目,就会被“关在门外”。这样将大大影响并发性,因为每个更新都有可能锁定数百行。

19.什么情况下会导致行的ROWID改变?
(1)在分区表中更新一行的分区键,使这一行必须从一个分区移至另一个分区;
(2)使用flashback table命令将一个数据库表恢复到以前的某个时间点;
(3)执行MOVE操作以及许多分区操作,如分解或合并分区;
(4)使用alter table shrink space命令执行段收缩;

20.要将每个表相同字段的数据类型修改成一样,如NUMBER和VARCHAR(2),否则会发生隐式转换,不使用所建的索引。

21.全局分区索引的优缺点?
优点是性能高,缺点是如果按时间删除历史分区表,则全局分区索引将会变成不可用。比较适用于OLTP系统。而本地分区索引比较实用于OLAP系统,因为会有可能历史数据的删除。

22.RAC中的特点是:
每一个节点的instance都有自己的SGA
每一个节点的instance都有自己的background process
每一个节点的instance都有自己的redo logs
每一个节点的instance都有自己的undo表空间
所有节点都共享一份datafiles和controlfiles

23.索引路劲扫描可以细分为以下:
(1)索引唯一性扫描      --索引使用的唯一列
(2)索引范围性扫描      --谓语使用范围运算
(3)全索引扫描          --SQL要求排序,如果索引的使用可以有效避免排序操作的出现。
(4)全索引快速扫描      --SQL不需要排序,如count(*)

24.什么情况下不会实现视图合并?
(1)集合运算(UNION,UNION ALL,INTERSECT,MINUS)
(2)CONNECT BY
(3)使用ROWNUM的情况
(4)SELECT-LIST中的统计函数(AVG,COUNT,MAX,MIN,SUM)
(5)GROUP BY(只有使用了MERGER提示或者相关参数(_complex_view_merging,optimizer_secure_view_merging)为ENABLE的情况下才可以合并)
(6)SELECT-LIST的DISTINCT(只有使用了MERGER提示或者相关参数(_complex_view_merging,optimizer_secure_view_merging)为ENABLE的情况下才可以合并)

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

请登录后发表评论 登录
全部评论

注册时间:2012-09-11

  • 博文量
    203
  • 访问量
    471905