当前位置:   article > 正文

Oracle的常见面试题_oracal面试

oracal面试

1. 多版本并发控制

首先,你可以理解oracle库中的表是有版本号的。每次commit之后,表的版本号是会发生变化的。

对于读操作来说,采用的是一致性读的方式,只会读取事务开始时,最新的版本号的内容。

对于更新操作来说,采用的当前读的方式:需要更新的数据是当前最新的版本得数据,会按当前最新的字段数据进行匹配。而不是事务开始时的那个版本的内容进行匹配。

有个问题需要关注:

如果有个开启了很久的事务,突然执行了select操作,那么它将会利用undo信息得到历史版本状态下的内容。注意这个版本号越旧需要的undo信息就会越多。

2. Oracle中的索引类型有哪些?

B*树索引:

非唯一索引:索引值+rowid

唯一索引:索引值

rowid: 行数据所在的内存地址。

位图索引:

原理:和倒排序的原理相识,用一张二维表去记录字符串在哪些记录id中出现过哪些记录id中没有出现,出现过的标记为1,没有出现过的标记为0.

适用场景:相异基数小的字段,比如性别,不适合用在OLTP类型的表中,不适用在高写入的场景,触发更新操作时,会锁定该位图索引类型的所有的行。用在OLAP场景是比较好的。

函数索引:

对函数处理后的结果值进行索引。

3. redo,undo,rollback介绍?

1. redo日志:就是重做日志,用途:数据备份,数据恢复,oracle中主要有两类重做日志,一类是在线重做,一类是归档重做。

归档重做日志:是在线重做日志的副本,在线日志满时,会将其同步到归档日志中。

在线重做日志:至少有两组,先写组1,组1写完再写组2

2. undo日志,与redo日志正好相反,它是需要回到更改前的状态;rollback会使用到undo日志,一致性读的时候也会使用到undo日志。

3. rollback,  撤销之前事务中所做的所有修改;释放锁资源

4. commit前后都做了些什么?

前:

修改数据;生成redo日志分;生成undo日志

后:

生成SCN:系统改变号,用于保证事务的顺序;将缓存中的redo日志刷到磁盘中。

5. Oracle优化的过程?

1.查看执行计划 以PLSQ为例
下面4个值:基数,字节数固定的sql理论上来说值应该是固定的;消耗和时间,应该是越小越好。
基数(Rows):Oracle估计的当前操作的返回结果集行数
字节(Bytes):执行该步骤后返回的字节数
耗费(COST)、CPU耗费:Oracle估计的该步骤的执行成本,用于说明SQL执行的代价,理论上越小越好(该值可能与实际有出入)
时间(Time):Oracle估计的当前操作所需的时间

2.查询的细节需要看description
表查询方式:
 a.table access full 全表扫描
 b.table access index rowid 通过rowId来取(rowid oracle自动添加 可以快速定位目标数据,索引B*(特点:多分支,有序,非叶子节点有指向兄弟节点的指针,叶子节点间有双向列表结构)数结构的叶子节点中存放了rowId)
 c.索引扫描:
    INDEX UNIQUE SCAN(索引唯一扫描) 数据量小
    INDEX RANGE SCAN(索引范围扫描)  数据量中
    INDEX FULL SCAN(索引全扫描)      数据量大,有排序;场景:1.只查询唯一索引字段的时候;2. 使用唯一索引进行排序的时候
    INDEX FAST FULL SCAN(索引快速扫描) 速度比full scan快,没有排序 使用count的时候会用到
    INDEX SKIP SCAN(索引跳跃扫描)前提条件:表有一个复合索引,且在查询时有除了前导列(索引中第一列)外的其他列作为条件

5. oracle中的表分区方案?


a. 列表分区:根据时间日,月,年之类的,无法实现自增
d. 区间分区:根据时间日,月,年之类的,可以实现分区自增 by range interval(自增关键字)
c. hash分区:适用于列值无法确定的情况,适用在userId,部门编码这样的字段,by hash,不能自增
d. 复合分区:可以构建子分区的
注意:分区必须配合本地local索引才能起作用。

 

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/码创造者/article/detail/958146
推荐阅读
相关标签
  

闽ICP备14008679号