Oracle数据库面试那些常见问题和答案,帮你快速准备面试不慌张
- 问答
- 2026-01-02 18:49:48
- 2
基础概念与体系结构类问题
问题1:请简单说一下Oracle数据库的体系结构中主要包含哪些部分? 答案: 这个问题主要是看你对数据库整体有没有一个概念,你可以把它想象成一个仓库管理系统,主要有这么几个关键部分:首先是最核心的数据库实例,它就像是仓库的管理办公室和保安系统,负责管理内存和后台进程,是动态的、在内存中运行的,然后是数据库文件本身,这就像仓库的库房和货架,数据实际存储在这里,是静态的、在硬盘上的文件,这些文件包括:数据文件(存数据)、控制文件(像仓库的图纸,记录数据库结构)、重做日志文件(记录所有操作,像仓库的监控录像,用于恢复),最后还有表空间,它像是仓库里的不同分区(比如食品区、家电区),是逻辑概念,由一个或多个数据文件组成。
问题2:说说表空间(Tablespace)和数据文件(Datafile)的关系? 答案: 这个问题考的是逻辑结构和物理结构的区别。表空间是逻辑存储单元,而数据文件是物理存储文件,一个表空间可以由一个或多个数据文件组成,但一个数据文件只能属于一个表空间,这就像你电脑上的D盘(相当于表空间)可以由一块硬盘的一部分或整个硬盘(相当于数据文件)来构成,但一块硬盘在分区后只能属于一个盘符,创建表的时候,我们指定它存放在哪个表空间里,而不用关心具体是哪个数据文件,Oracle会自动管理。
问题3:Oracle的SGA是什么?它里面主要有哪些组件? 答案: SGA全称是系统全局区,它是Oracle实例的心脏,是一块巨大的共享内存区域,所有服务器进程都能访问它,你可以把它理解为数据库的“工作台”或“高速缓存区”,主要组件包括:

- 数据库缓冲区缓存:这是最重要的部分,它缓存从数据文件读出来的数据块,当用户查询数据时,Oracle会先来这里找,找到了就直接返回(叫逻辑读),比去硬盘读(叫物理读)快得多。
- 共享池:主要缓存执行过的SQL语句和执行计划,这样如果别人执行一模一样的SQL,就可以直接拿来用,不用再分析一遍,大大提高了效率。
- 重做日志缓冲区:一个小的缓冲区域,临时存放数据库发生的所有变更记录,然后由后台进程写入到重做日志文件中。
SQL与PL/SQL编程类问题
问题4:TRUNCATE和DELETE命令有什么区别? 答案: 这是非常高频的问题,主要区别有几点:
- 语言性质:DELETE是DML语句(数据操作语言),而TRUNCATE是DDL语句(数据定义语言)。
- 回滚:DELETE操作可以被回滚,因为它会生成重做日志和回滚数据,TRUNCATE操作默认情况下不能被回滚(在10g之后,如果是在FLASHBACK的情况下可以恢复,但通常认为不可回滚)。
- 速度:TRUNCATE速度远快于DELETE,因为DELETE是一行一行地删除,会写大量日志;而TRUNCATE是直接回收整个表的数据段(相当于清空仓库并重置),效率极高。
- 触发器:DELETE操作会触发表的触发器,TRUNCATE不会。
- 条件:DELETE可以带WHERE条件删除部分数据,TRUNCATE只能清空整个表。
问题5:说说什么是事务?Oracle中事务是如何控制的? 答案: 事务就是一组要么全部成功、要么全部失败的SQL语句集合,是数据库工作的逻辑单元,最经典的例子就是银行转账,A转给B100元,A账户减100和B账户加100必须作为一个整体,Oracle中通过COMMIT(提交,让所有更改永久生效)、ROLLBACK(回滚,撤销所有未提交的更改)和SAVEPOINT(设置保存点,可以回滚到特定点)来控制事务。

问题6:存储过程和函数有什么区别? 答案: 它们都是PL/SQL块,但设计目的不同:
- 主要目的:存储过程主要目的是执行一系列操作,不必须返回值;而函数的主要目的是进行计算并返回一个值。
- 调用方式:存储过程一般作为独立的PL/SQL语句被调用(
EXECUTE proc_name;);而函数因为返回一个值,所以通常用在SQL语句中,SELECT my_function(...) FROM dual;。 - 返回值:过程可以通过OUT参数返回多个值,函数必须通过RETURN子句返回一个值。
- DML语句:在函数中虽然可以执行DML,但如果在SQL语句内调用自定义函数,则该函数通常不能对数据库表进行修改。
管理与运维类问题
问题7:说说你对索引的理解,什么时候该建索引? 答案: 索引就像一本书的目录,能帮助我们快速找到数据,避免全表扫描。应该建索引的情况包括:经常出现在WHERE子句中的列、连接条件(外键)上的列、需要排序(ORDER BY)或分组(GROUP BY)的列。不适合建索引的情况包括:表很小、列的值重复度非常高(比如性别字段,只有‘男’‘女’)、该列不经常被查询,索引不是越多越好,因为索引本身也需要维护,会增加INSERT、UPDATE、DELETE的开销。

问题8:如何查看一条SQL语句的执行计划?为什么要看执行计划?
答案: 最常用的方法是使用EXPLAIN PLAN FOR命令,或者在PL/SQL Developer等工具中按F5,执行计划是Oracle如何执行一条SQL语句的“路线图”。看执行计划的目的是为了进行SQL优化,找出SQL慢的原因,你可以看到优化器是选择了索引扫描还是全表扫描,表之间是如何连接的,如果发现一个应该走索引的查询却做了全表扫描,那可能就是索引没建或者失效了,需要优化。
问题9:RMAN是什么?它的主要作用是什么? 答案: RMAN是Oracle提供的恢复管理器,是专业做数据库备份和恢复的工具,相比于手动拷贝文件,RMAN的优势非常明显:它可以进行增量备份(只备份变化的数据块,节省空间和时间),它能自动管理备份集,并且在恢复时能够将数据库恢复到任意时间点,是保证数据安全的核心工具。
故障处理与性能优化类问题
问题10:如果遇到“ORA-01555: 快照过旧”错误,可能是什么原因?如何解决? 答案: 这个错误通常发生在长时间运行的查询中,就是你的查询需要读取一个数据块在查询开始时的样子(旧版本),但这个旧版本已经被覆盖了,主要原因可能是:回滚段太小或太少,导致旧的回滚信息被新的事务覆盖了;或者查询运行时间太长,解决方法包括:增加回滚段的大小和数量(优化UNDO表空间)、尝试优化那个长时间运行的查询,让它跑得快一点。
问题11:如何定位和优化一条执行很慢的SQL语句? 答案: 这是一个综合性的问题,基本思路是:
- 定位:通过查询
V$SQL等动态性能视图,找出消耗资源(逻辑读、CPU时间、执行次数多)的TOP SQL。 - 查看执行计划:对找到的慢SQL使用
EXPLAIN PLAN,分析其执行计划,看是否存在全表扫描、错误的连接方式(如笛卡尔积)等问题。 - 优化手段:
- 检查WHERE子句中的列是否有合适的索引。
- 考虑SQL语句的写法,避免在索引列上使用函数或计算(比如
WHERE TO_CHAR(date_col) = '...'会导致索引失效)。 - 考虑是否可以通过重构SQL,比如使用WITH子句或调整连接顺序来优化。
- 检查表统计信息是否过时,必要时重新收集。
希望以上这些直接的问题和答案能帮助你建立信心,在面试中从容应对,结合自己的实际经验来回答会比单纯背诵答案效果更好。
本文由钊智敏于2026-01-02发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:http://waw.haoid.cn/wenda/73244.html
