Oracle 面试高频问题汇总
经过漫长的学习,是时候检验成果了。
这篇汇总涵盖 Oracle 面试中的核心知识点,帮助你快速梳理、查漏补缺。
一、Oracle 架构与基础
1.1 Instance 与 Database 的区别
问题:Oracle 中的 Instance 和 Database 有什么区别?
参考答案:
Instance 是 Oracle 的软件层,由内存结构(SGA、PGA)和后台进程组成,是临时的(启动时创建,关闭时销毁);Database 是物理层,由数据文件、日志文件、控制文件组成,是持久的。
一个 Instance 只能访问一个 Database,但一个 Database 可以被多个 Instance 访问(这就是 Oracle RAC 的原理)。
1.2 SGA 与 PGA 的区别
问题:SGA 和 PGA 有什么区别?
参考答案:
| 维度 | SGA | PGA |
|---|---|---|
| 共享性 | 所有进程共享 | 每个进程私有 |
| 存储内容 | 数据缓存、SQL 缓存、重做日志 | 排序区、哈希区、会话信息 |
| 大小调整 | 可动态调整 | 需重启或配置 |
1.3 后台进程核心作用
问题:请说明以下进程的作用:DBWn、LGWR、CKPT、SMON、PMON、ARCn。
参考答案:
| 进程 | 全称 | 核心作用 |
|---|---|---|
| DBWn | Database Writer | 将脏数据写入磁盘(延迟写入) |
| LGWR | Log Writer | 将重做日志写入磁盘(同步,事务提交必须) |
| CKPT | Checkpoint | 更新控制文件和数据文件头 |
| SMON | System Monitor | 实例恢复、清理临时段 |
| PMON | Process Monitor | 清理失败进程、回滚事务 |
| ARCn | Archiver | 归档重做日志 |
1.4 LGWR 与 DBWn 的区别
问题:LGWR 和 DBWn 有什么区别?
参考答案:
LGWR 将重做日志同步写入磁盘(事务提交时必须先完成),保证事务持久性;DBWn 将脏数据异步延迟写入磁盘,用于释放 Buffer Cache。LGWR 必须先完成,否则事务无法提交。
二、事务与并发
2.1 事务的 ACID 特性
问题:Oracle 如何保证事务的 ACID 特性?
参考答案:
- 原子性(Atomicity):通过 UNDO 日志实现,未提交事务的修改可撤销
- 一致性(Consistency):通过约束、触发器、锁机制保证数据完整
- 隔离性(Isolation):通过锁和 MVCC 实现,支持 READ COMMITTED 和 SERIALIZABLE
- 持久性(Durability):通过 REDO 日志保证,事务提交必须先写 REDO
2.2 UNDO 与 REDO 的区别
问题:UNDO 和 REDO 有什么区别?
参考答案:
| 维度 | REDO | UNDO |
|---|---|---|
| 记录内容 | 修改后的值 | 修改前的值 |
| 用途 | 重做已提交事务 | 回滚未提交事务 |
| 恢复 | 用于实例恢复 | 用于回滚、读一致性 |
2.3 隔离级别
问题:Oracle 支持哪些隔离级别?默认是什么?
参考答案:
Oracle 支持 READ COMMITTED(默认)和 SERIALIZABLE。READ COMMITTED 每次查询看到最新已提交的数据;SERIALIZABLE 整个事务看到事务开始时的快照。
2.4 乐观锁与悲观锁
问题:乐观锁和悲观锁的区别?何时使用?
参考答案:
悲观锁先锁定再操作(SELECT FOR UPDATE),适合冲突频繁的场景;乐观锁最后检查冲突(版本号),适合冲突较少的场景。乐观锁需要重试机制,悲观锁需要处理锁等待。
三、存储与索引
3.1 表空间类型
问题:Oracle 有哪些表空间类型?
参考答案:
- 永久表空间(PERMANENT):存储永久对象(表、索引)
- 临时表空间(TEMPORARY):存储排序等临时操作
- 撤销表空间(UNDO):存储撤销数据
3.2 堆表与 IOT 的区别
问题:堆表和 IOT 有什么区别?
参考答案:
堆表数据无序存储,通过 ROWID 定位;IOT 按主键顺序存储,表本身就是索引结构,主键查询只需一次 I/O。IOT 必须有主键,适合主键查询频繁的场景。
3.3 索引类型与选择
问题:B 树索引和位图索引有什么区别?
参考答案:
B 树索引适合高基数列(唯一或近似唯一)、并发写入;位图索引适合低基数列(枚举值)、静态数据。位图索引在 OLTP 环境要慎用,因为锁粒度粗。
3.4 复合索引最左前缀
问题:复合索引 (A, B, C) 可以被哪些查询使用?
参考答案:
可以被 (A)、(A, B)、(A, B, C) 使用,但不能被 (B)、(C)、(B, C) 使用。跳过前导列的查询无法使用索引。
3.5 分区表类型
问题:Oracle 有哪些分区类型?
参考答案:
- 范围分区(RANGE):按数值或日期范围
- 列表分区(LIST):按枚举值列表
- 哈希分区(HASH):按哈希值均匀分布
- 复合分区:两种分区方式组合(如 RANGE-LIST)
四、SQL 与 PL/SQL
4.1 SELECT 执行顺序
问题:SELECT 语句的执行顺序是什么?
参考答案:
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT/ROWNUM。
4.2 rownum 与 row_number() 的区别
问题:rownum 和 row_number() 有什么区别?
参考答案:
ROWNUM 是伪列,在 WHERE 之前产生,不能直接用于排序后分页;ROW_NUMBER() 是分析函数,可以指定排序规则,是 Oracle 8i+ 的推荐方案。
4.3 触发器类型
问题:有哪些触发器类型?INSTEAD OF 触发器有什么用?
参考答案:
BEFORE/AFTER 触发器用于表;INSTEAD OF 触发器用于视图,让视图可 DML。行级触发器(FOR EACH ROW)每行触发一次,语句级触发器整条语句触发一次。
4.4 集合类型
问题:PL/SQL 有哪些集合类型?
参考答案:
- 关联数组(Associative Array):键值对,PL/SQL 专用
- 嵌套表(Nested Table):可变大小数组,可持久化
- VARRAY:固定上限数组
4.5 BULK COLLECT 与 FORALL
问题:BULK COLLECT 和 FORALL 有什么用?
参考答案:
BULK COLLECT 一次从 SELECT 获取多行到集合,减少 SQL 与 PL/SQL 上下文切换;FORALL 一次将集合中的多条数据写入数据库。两者配合使用可显著提升批量操作性能。
五、性能优化
5.1 执行计划操作类型
问题:常见执行计划操作类型的性能排序?
参考答案:
INDEX UNIQUE SCAN(最快)> INDEX RANGE SCAN > INDEX FULL SCAN > TABLE ACCESS BY INDEX ROWID > TABLE ACCESS FULL(最慢)。
5.2 统计信息的作用
问题:统计信息对优化器有什么用?
参考答案:
优化器根据统计信息估算每个执行步骤的成本,选择最优执行计划。统计信息包括表统计(行数、块数)、列统计(唯一值、空值)、直方图(数据分布)等。
5.3 绑定变量
问题:为什么要使用绑定变量?
参考答案:
绑定变量让 Oracle 共享执行计划,减少硬解析,降低 CPU 消耗和 Shared Pool 竞争。但可能导致绑定变量窥视问题(数据分布不均时选错执行计划)。
5.4 SQL 优化技巧
问题:常见的 SQL 优化技巧有哪些?
参考答案:
- 避免 SELECT *,只查需要的列
- 避免在索引列上使用函数
- 使用 EXISTS 代替 IN
- 使用 UNION ALL 代替 UNION(不去重时)
- 避免 LIKE 前缀通配符
- 创建合适的索引
5.5 索引失效场景
问题:什么情况下索引会失效?
参考答案:
- 在索引列上使用函数
- 使用 LIKE 前缀通配符
- 隐式类型转换
- 使用否定条件(!=、NOT IN)
- 统计信息不准确
六、高可用与集群
6.1 RAC 的核心机制
问题:Oracle RAC 的核心是什么?
参考答案:
RAC 通过多个实例同时访问一个数据库实现高可用和负载均衡。核心是 Cache Fusion,实现节点间缓存数据的直接传输,无需磁盘 I/O。
6.2 Data Guard 架构
问题:Data Guard 有哪些角色和模式?
参考答案:
角色:Primary Database(主库)和 Standby Database(备库,物理/逻辑)。保护模式:Maximum Availability(零丢失,可能短暂中断)、Maximum Performance(可能丢少量数据)、Maximum Protection(零丢失,主库不可用)。
6.3 RAC 与 Data Guard 的区别
问题:RAC 和 Data Guard 的区别?
参考答案:
RAC 通过多节点共享存储实现高可用和负载均衡,节点间实时同步;Data Guard 通过主备库同步实现灾备,支持异地部署。两者可以结合使用。
6.4 ASM 的优势
问题:ASM 有什么优势?
参考答案:
ASM 自动管理存储,提供条带化和镜像,提高 I/O 性能和可靠性。支持在线添加/删除磁盘、自动重新平衡、简化的存储管理。
七、综合应用题
7.1 场景分析
问题:一条 SQL 查询很慢,如何排查?
参考答案:
- 查看执行计划,确认是否走全表扫描
- 检查统计信息是否过期
- 分析表结构,确认是否有合适的索引
- 检查是否有函数索引需求
- 分析连接方式和连接顺序
- 考虑 SQL 重写或 Hint 调整
7.2 性能调优思路
问题:如何定位和解决 Oracle 数据库性能问题?
参考答案:
- 定位:通过 AWR/ASH 确定 Top SQL 和 Top 等待事件
- 分析:查看执行计划,分析瓶颈
- 优化:根据瓶颈调整(SQL 优化、索引创建、参数调整)
- 验证:对比优化前后的性能
- 监控:持续监控,避免性能回退
八、面试技巧
8.1 回答原则
| 原则 | 说明 |
|---|---|
| 先结论后展开 | 先给出明确答案,再解释原因 |
| 适当举例 | 用具体例子说明抽象概念 |
| 画图说明 | 架构类问题可画图解释 |
| 关联知识 | 适当关联其他知识点 |
| 诚实回答 | 不会的问题诚实说,不要瞎猜 |
8.2 常见追问
面试官可能在回答后追问:
- 为什么是这样?(原理层面)
- 和 XX 有什么区别?(对比层面)
- 实际项目中遇到过什么问题?(实践层面)
- 如何优化/解决?(方案层面)
8.3 项目经验准备
面试中可能会问:
- 你负责的数据库规模多大?
- 遇到过哪些性能问题?如何解决的?
- 数据备份策略是什么?
- 如何保证数据库高可用?
九、知识地图
Oracle 知识体系
├── 架构原理
│ ├── Instance vs Database
│ ├── SGA / PGA
│ └── 后台进程
├── 物理结构
│ ├── 数据文件
│ ├── 日志文件
│ └── 控制文件
├── 逻辑结构
│ ├── 表空间
│ ├── 段 / 区 / 块
│ └── 表类型
├── 事务并发
│ ├── ACID 特性
│ ├── 隔离级别
│ ├── 锁机制
│ └── UNDO/REDO
├── SQL/PL/SQL
│ ├── SQL 基础
│ ├── 高级查询
│ ├── PL/SQL 块
│ └── 存储过程/函数/触发器
├── 存储与索引
│ ├── 表类型
│ ├── 索引类型
│ ├── 分区表
│ └── 压缩技术
├── 性能优化
│ ├── 执行计划
│ ├── SQL 优化
│ ├── 统计信息
│ └── 绑定变量
└── 高可用
├── RAC
├── Data Guard
├── ASM
├── RMAN
└── GoldenGate十、总结
Oracle 是一个庞大的体系,但这张知识地图帮你理清了脉络。
记住:原理是基础,实战是关键,表达是加分项。
祝你面试顺利!
下一步
- Oracle 架构概览:回到起点,系统复习
- Java 面试指南:Java 相关面试知识
