Skip to content

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 有什么区别?

参考答案

维度SGAPGA
共享性所有进程共享每个进程私有
存储内容数据缓存、SQL 缓存、重做日志排序区、哈希区、会话信息
大小调整可动态调整需重启或配置

1.3 后台进程核心作用

问题:请说明以下进程的作用:DBWn、LGWR、CKPT、SMON、PMON、ARCn。

参考答案

进程全称核心作用
DBWnDatabase Writer将脏数据写入磁盘(延迟写入)
LGWRLog Writer将重做日志写入磁盘(同步,事务提交必须)
CKPTCheckpoint更新控制文件和数据文件头
SMONSystem Monitor实例恢复、清理临时段
PMONProcess Monitor清理失败进程、回滚事务
ARCnArchiver归档重做日志

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 有什么区别?

参考答案

维度REDOUNDO
记录内容修改后的值修改前的值
用途重做已提交事务回滚未提交事务
恢复用于实例恢复用于回滚、读一致性

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 查询很慢,如何排查?

参考答案

  1. 查看执行计划,确认是否走全表扫描
  2. 检查统计信息是否过期
  3. 分析表结构,确认是否有合适的索引
  4. 检查是否有函数索引需求
  5. 分析连接方式和连接顺序
  6. 考虑 SQL 重写或 Hint 调整

7.2 性能调优思路

问题:如何定位和解决 Oracle 数据库性能问题?

参考答案

  1. 定位:通过 AWR/ASH 确定 Top SQL 和 Top 等待事件
  2. 分析:查看执行计划,分析瓶颈
  3. 优化:根据瓶颈调整(SQL 优化、索引创建、参数调整)
  4. 验证:对比优化前后的性能
  5. 监控:持续监控,避免性能回退

八、面试技巧

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 是一个庞大的体系,但这张知识地图帮你理清了脉络。

记住:原理是基础,实战是关键,表达是加分项

祝你面试顺利!


下一步

基于 VitePress 构建