ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Oracle 数据库是怎么工作的?一篇讲清楚

Oracle 数据库是怎么工作的?一篇讲清楚 写在前面这篇文章是写给测试工程师、初级开发、数据库初学者看的。我不会堆术语而是用「一句话结论 通俗解释 原理图 测试视角」的方式把 Oracle 的核心原理讲清楚。读完你不仅能看懂执行计划、AWR 报告面试被问到 Oracle 原理也能有条理地说出来。本文配套10 张原理图建议结合图片一起看理解会快很多。目录一、Oracle 到底是个什么东西二、实例与数据库Oracle 的第一层认知三、内存结构数据为什么这么快四、存储结构数据是怎么落盘的五、一条 SQL 是怎么执行的重点六、事务与 ACID数据为什么不会乱七、索引与 BTree为什么查询这么快八、分区表大表是怎么管理的九、AWROracle 怎么监控性能十、执行计划怎么定位慢 SQL十一、测试工程师的 Oracle 核心全景十二、面试高频追问附标准答案一、Oracle 到底是个什么东西很多新手一上来就被「Oracle」这个名字唬住。其实换个角度就很简单Oracle 就是一个帮你「存数据、取数据、保证数据安全」的软件。你写的 Java / Python 程序或者你做的自动化测试脚本本质上都只是「客户端」。真正干活的、把数据持久化保存的是 Oracle 这个「服务端数据库」。1.1 用生活例子理解想象一个图书馆现实图书馆Oracle 里的对应书架放书的地方数据文件放数据的地方管理员后台进程管理员的大脑/备忘录内存SGA借书登记本重做日志Redo图书编目卡片索引借书的人客户端你的程序 / 测试脚本你客户端说「我要查张三的订单」Oracle 管理员服务端去书架数据文件帮你翻翻完把结果给你。这就是一次数据库操作。1.2 客户端 / 服务端C/S架构Oracle 是经典的客户端-服务端Client/Server架构客户端SQL*Plus、PL/SQL Developer、你的 Java 代码、你的测试脚本服务端Oracle 数据库软件运行在服务器上两者之间通过网络通信测试视角你写的自动化脚本连数据库报错先分清是「客户端连不上」网络/监听还是「服务端出问题」数据库挂了/锁表排查思路完全不同。二、实例与数据库Oracle 的第一层认知这是 Oracle 最核心、也最容易混的一对概念。记住一句话就行「实例」是内存进程活的、运行时的「数据库」是磁盘上的物理文件死的、持久化的。图 1Oracle 整体架构 实例内存进程 数据库物理文件2.1 两个核心概念概念本质比喻实例Instance内存结构SGA/PGA 后台进程图书馆正在上班的管理员 他的工作台数据库Database物理文件数据文件/控制文件/日志文件图书馆的书架和书关系一个实例「挂载」一个数据库数据库的数据被实例读到内存里处理。启动数据库 启动实例 挂载并打开数据库关闭数据库 把内存里的脏数据刷到磁盘 释放内存和进程2.2 为什么要分成两块因为内存比磁盘快 10 万倍。如果每次查数据都直接读磁盘数据库会慢到没法用。所以 Oracle 的设计哲学是能放内存就放内存必须持久化的才写磁盘。这就引出了下面的内存结构。三、内存结构数据为什么这么快图 2SGA 内存结构。测试岗最该关注的是 Buffer Cache 和 Shared Pool。Oracle 的内存分两大块SGA共享和PGA私有。3.1 SGA系统全局区——大家共用的「公共工作区」SGA 是所有会话连接共享的大内存区核心有三个组件组件作用小白理解Buffer Cache数据缓存缓存从磁盘读上来的数据块「逻辑读的来源」命中缓存就不需要读磁盘Shared Pool共享池缓存 SQL 文本和执行计划「软解析的关键」避免重复解析Redo Log Buffer重做日志缓存缓存事务修改记录保证数据不丢见事务章节3.2 PGA程序全局区——每个会话独享的「私人空间」每个客户端连接会话都有自己的一块私有内存存会话的变量、绑定变量值排序、Hash Join 的临时工作区PGA 不共享所以会话之间互不干扰。3.3 测试岗为什么要关心内存因为很多性能问题的根因都在内存Buffer Cache 命中率低→ 大量物理读 → SQL 慢Shared Pool 不够→ 硬解析飙升 → CPU 飙升PGA 不够→ 排序溢出到磁盘 → 临时表空间暴涨 看 AWR 报告时后面会讲这几块是重点排查对象。四、存储结构数据是怎么落盘的图 4Oracle 存储结构逻辑层层映射到物理文件。Oracle 的存储分「逻辑结构」和「物理结构」两套视角。新手容易绕记住**左边是「概念」右边是「文件」**就行。4.1 逻辑结构由大到小表空间 (Tablespace) → 段 (Segment) → 区 (Extent) → 块 (Block)层级说明表空间最大的逻辑单位一个数据库有多个表空间如 SYSTEM、SYSAUX、USERS段Segment一个表、一个索引就是一个段区Extent一组连续的数据块段的分配单位块Block最小的存储单位默认 8KB重点记住Oracle 读写的最小单位是「块Block默认 8KB」。这也是为什么前面讲BUFFER_GETS/DISK_READS的单位是「块数」而不是字节。4.2 物理结构三种文件文件作用数据文件.dbf存表、索引的真实数据由 Block 组成控制文件.ctl记录数据库结构、当前 SCN系统变更号等关键信息重做日志文件.log记录所有数据修改Redo用于崩溃恢复4.3 逻辑 ↔ 物理 的映射简单说表空间由若干数据文件组成段的数据最终落在数据文件的 Block 里。测试视角当你做「数据迁移 / 表空间扩容 / 备份恢复」测试时操作的其实是这些物理文件。理解这个映射才不会把「表空间满了」和「磁盘满了」搞混。五、一条 SQL 是怎么执行的重点图 3一条 SQL 从客户端到结果集的完整流程。这是面试必考、排查 SQL 慢的根本。我们以一条查询为例SELECT*FROMempWHEREdeptno10;5.1 执行流程拆解步骤名称干了什么1连接客户端通过网络连上服务端监听器分配 Server Process2解析Parse检查语法、语义表/列是否存在、权限3绑定Bind传入绑定变量的值如果有4执行Execute生成并执行执行计划真正去取数据5取数Fetch把结果集返回给客户端5.2 软解析 vs 硬解析性能关键这一步是性能优化的核心考点硬解析SQL 第一次执行要完整解析、生成执行计划 →很慢软解析SQL 已经在 Shared Pool 里了直接复用执行计划 →很快一句话硬解析是性能杀手。为什么要用「绑定变量」-- ❌ 不好每次值不同都是新 SQL都走硬解析SELECT*FROMempWHEREdeptno10;SELECT*FROMempWHEREdeptno20;-- ✅ 好同一句 SQL只解析一次SELECT*FROMempWHEREdeptno:1;测试岗实战做压力测试时如果代码里全是拼接 SQL不带绑定变量并发一上来你会发现CPU 飙升、响应变慢——这就是硬解析太多。这个坑测试同学一定要知道。六、事务与 ACID数据为什么不会乱图 5事务 ACID 与 Redo / Undo 的对应关系。事务Transaction是数据库的基石。一句话事务就是「一组操作要么全成功要么全失败」。6.1 ACID 四大特性特性含义Oracle 靠什么实现A 原子性要么全做要么全不做Undo回滚C 一致性数据完整性不被破坏约束 UndoI 隔离性并发事务互不干扰锁 MVCC多版本D 持久性提交后永久保存Redo重做日志6.2 Redo 和 Undo一对好基友这两个概念新手最容易混记住一句对比就够了Redo 「做了什么」用于重放保证不丢Undo 「修改前的值」用于回滚 一致性读Redo重做日志记录所有对数据的修改操作事务提交时先保证 Redo 写到磁盘再返回成功数据库崩溃后用 Redo重新把已提交的数据恢复出来→ 保证持久性Undo回滚段记录数据修改前的值事务回滚时用 Undo 把数据还原别的会话读数据时如果看到的是「正在被修改的中间状态」Oracle 会用 Undo 构造一个一致性快照给它看 → 这就是MVCC6.3 测试岗必懂的实战场景场景原理脏读读到了别人未提交的数据Oracle 默认隔离级别下基本不会发生不可重复读同一事务两次读同一行结果不一样幻读同一事务两次范围查询行数变了死锁两个事务互相持有对方要的锁互相等待测试视角你测「并发下单 / 并发扣库存」时发现数据对不上90% 是事务隔离级别或锁的问题。理解 ACID 和锁才能精准定位这类 bug。七、索引与 BTree为什么查询这么快图 6BTree 索引结构。非叶子只存 key树矮叶子双向链表范围查询快。「为什么加了索引查询就快了」——这是面试最高频问题之一。答案就藏在BTree里。7.1 先理解「为什么不用二叉树」二叉树每个节点只有 2 个子节点100 万数据树高约 20 层每一层 一次磁盘 IO → 查一次要 20 次 IO太慢解决思路把树「拍扁」——一个节点存多个 key →B 树 / BTree。7.2 BTree 的三个关键改进相比 B 树BTree 做了 3 个让数据库「飞起来」的设计① 非叶子节点只存 key不存数据→ 一个节点能放更多 key →树更矮→ IO 更少通常 3~4 层就够千万级数据② 叶子节点用双向链表连接→ 范围查询如BETWEEN 10 AND 25顺着链表往后扫就行不需要回溯整棵树③ 所有查询路径等长→ 查询性能稳定、可预测7.3 聚簇索引 vs 二级索引InnoDB 为例注Oracle 索引逻辑类似MySQL InnoDB 的聚簇索引概念更直观这里用它辅助理解。聚簇索引主键叶子节点直接存整行数据二级索引叶子节点存索引列 主键值找到主键后再「回表」查主键索引拿整行7.4 测试岗要记住的「索引失效」场景这些是测试 SQL 时常见的坑也是面试点-- ❌ 索引可能失效的场景WHEREYEAR(create_time)2026;-- 对列用了函数WHEREnameLIKE%张%;-- 前导通配符WHEREamount1100;-- 对列做了运算WHEREstatus1ORstatus2;-- 某些情况优化器放弃索引测试视角写用例时要专门覆盖「索引失效」场景比如「对日期列套函数后查询是否变慢」这就是性能测试的切入点。八、分区表大表是怎么管理的图 7分区表 逻辑一张表物理多个段。当一张表的数据量达到千万级全表操作扫描、删除、备份都会变得非常慢。这时候就要用分区表。8.1 一句话理解分区表 一张逻辑上的大表底层被拆成多个物理段分区每个分区可以独立管理。对应用来说还是那张表SQL 不用改对数据库来说数据分散在多个分区里。8.2 核心价值分区裁剪Partition PruningSELECT*FROMordersWHEREorder_dateDATE2026-01-01ANDorder_dateDATE2026-02-01;如果orders按order_date做了范围分区Oracle 一看条件 → 只扫p_2026_01这一个分区其他分区直接跳过10 亿行数据可能只扫 1/120性能差距巨大。8.3 什么时候该用分区判断标准单表超过 500 万~1000 万行或 2~5 GB就要认真考虑分区。但比数据量更重要的是业务场景场景是否该分区需要定期按时间删老数据✅ 强烈建议DROP PARTITION 秒级DELETE 极慢查询带分区键如时间✅ 能享受分区裁剪查询从不带分区键❌ 反而可能更慢小表 100 万❌ 杀鸡用牛刀8.4 常见分区类型类型适用范围分区Range按时间最常用列表分区List按地区/状态哈希分区Hash无明显分区键打散数据间隔分区Interval11g自动按月/天建分区生产推荐九、AWROracle 怎么监控性能图 8AWR 采集链路 —— SGA 统计 → MMON 快照 → SYSAUX 存储 → 报告。AWRAutomatic Workload Repository是 Oracle 内置的「历史性能数据仓库」。它不是实时监控而是定时采样 快照对比的思路。9.1 采集机制MMON 进程默认每小时把 SGA 里的统计信息拍成一个快照Snapshot存进SYSAUX表空间MMNL 进程每秒采样活跃会话进 ASHActive Session History快照默认保留 8 天9.2 怎么用 AWR 排查问题-- 1. 取问题时间段的快照 IDSELECTsnap_id,begin_interval_timeFROMdba_hist_snapshotWHEREbegin_interval_timeBETWEEN...AND...;-- 2. 生成 AWR 报告?/rdbms/admin/awrrpt.sql-- 输入 begin/end snap_id9.3 读 AWR 报告的「5 个重点」顺序看什么判断什么①DB Time vs ElapsedAAS DB Time / Elapsed判断数据库忙不忙②Top Timed Events瓶颈类型CPUIO锁③Load Profile每秒事务、物理读、redo 量④Instance EfficiencyBuffer Hit%、Library Hit%⑤SQL ordered by Elapsed抓出最慢的 SQL测试视角做性能测试时跑完压测脚本第一时间拉 AWR 报告看 DB Time 和 Top SQL这是定位性能瓶颈的标准动作。十、执行计划怎么定位慢 SQL图 9执行计划读取顺序 —— 缩进最深的先执行从内到外、从下到上。SQL 慢不慢不看代码看执行计划。执行计划告诉你 Oracle 打算怎么访问数据、用什么索引、怎么 Join。10.1 四种查看方式方式特点EXPLAIN PLAN FORDBMS_XPLAN.DISPLAY最常用不用真正执行SET AUTOTRACE ON会执行能看到逻辑读/物理读V$SQL_PLAN/DISPLAY_CURSOR查已执行 SQL 的真实计划AWR 里的DISPLAY_AWR查历史 SQL-- 最常用EXPLAINPLANFORSELECT*FROMempWHEREdeptno10;SELECT*FROMTABLE(DBMS_XPLAN.DISPLAY);10.2 怎么读执行计划核心规则从内到外、从下到上缩进最深的先执行。Id | Operation | Name 0 | SELECT STATEMENT | 1 | HASH JOIN | ← 第三步 2 | TABLE ACCESS FULL | DEPT ← 第一步 3 | TABLE ACCESS FULL | EMP ← 第二步执行顺序DEPT 全扫 → EMP 全扫 → HASH JOIN → SELECT 返回10.3 关键 Operation 速查Operation含义好坏TABLE ACCESS FULL全表扫描大表慎用INDEX RANGE SCAN索引范围扫描✅ 好TABLE ACCESS BY INDEX ROWID回表看次数HASH JOIN哈希连接大数据集常用NESTED LOOPS嵌套循环小表驱动时好SORT ORDER BY排序尽量避免10.4 判断执行计划「好不好」✅好小表走索引、大表走分区裁剪、Join 顺序合理、预估行数接近实际❌坏大表全表扫、索引失效、嵌套循环驱动表太大、预估行数偏差百倍测试视角性能测试用例里对每条核心 SQL 都要核对执行计划确保它「走对了索引、没走全表扫」——这就是「执行计划断言」是高级测试工程师的必备技能。十一、测试工程师的 Oracle 核心全景图 10测试工程师的 Oracle 原理学习路线从 SQL 执行到底层存储。把前面所有内容串起来作为测试工程师你需要按这个优先级掌握 Oracle 原理层级内容测试用途① SQL 执行 执行计划定位慢 SQL性能测试、SQL 审查② 索引 / BTree / 分区理解「为什么慢、怎么优化」设计性能用例③ 事务 / 锁 / 隔离级别数据一致、并发 bug并发测试、死锁复现④ AWR / ASH 监控整体性能瓶颈压测后分析⑤ 存储 / 内存 / 进程底层原理支撑故障排查、容量规划学习建议先会用会写 SQL、会连数据库、会跑测试再会看看得懂执行计划、看得懂 AWR 报告最后理解原理BTree、事务、内存结构实战为王在自己机器装个 Oracle / 用 Docker把本文每个例子都跑一遍十二、面试高频追问附标准答案Q1Oracle 里「实例」和「数据库」的区别答实例是内存结构SGA/PGA 后台进程是运行时活的数据库是磁盘上的物理文件数据文件/控制文件/日志文件是持久化的。一个实例挂载一个数据库。Q2为什么用绑定变量答避免硬解析。SQL 带绑定变量时相同结构的 SQL 只解析一次软解析复用执行计划拼接 SQL 每次都是新 SQL都走硬解析高并发下 CPU 飙升。Q3Redo 和 Undo 的区别答Redo 记录「做了什么」用于崩溃后重放、保证持久性Undo 记录「修改前的值」用于回滚和一致性读MVCC。Q4为什么索引查询快答因为用的是 BTree。非叶子节点只存 key树矮 IO 少叶子节点双向链表连接范围查询快所有查询路径等长性能稳定。Q5什么时候该用分区表答单表超 500 万~1000 万行或 2~5 GB 时考虑最核心的判断是有没有「按时间定期删数据」的需求——有就用因为 DROP PARTITION 秒级完成比 DELETE 快几个数量级。同时查询必须带分区键才能享受分区裁剪。Q6怎么定位慢 SQL答四步走 —— ① 看执行计划EXPLAIN PLAN/AUTOTRACE② 重点看是否全表扫描、索引失效、Join 方式③ 对比预估行数和实际行数④ 跑完压测拉 AWR 报告看 Top SQL by Elapsed。Q7buffer_gets 和 disk_reads 的单位是什么答都是「块Block次数」不是字节也不是时间。1 次 读取 1 个数据块默认 8KB。Buffer Gets 是逻辑读内存Disk Reads 是物理读磁盘。总结Oracle 看着庞大其实核心就几条主线数据在哪儿→ 存储结构表空间/段/区/块 数据文件怎么取最快→ 内存Buffer Cache 索引BTree怎么保证正确→ 事务ACID Redo/Undo 锁怎么管大表→ 分区表怎么查性能→ AWR 执行计划作为测试工程师你不需要像 DBA 那样精通每一个参数但你必须理解这些原理才能设计出有效的性能测试用例、精准定位 bug 根因。这也是面试官最看重的——知其然更知其所以然。✍️如果觉得有帮助欢迎点赞、收藏、关注。有问题欢迎评论区交流附图片清单图内容01Oracle 整体架构实例 数据库02SGA 内存结构03SQL 执行流程04逻辑 vs 物理存储结构05事务 ACID Redo/Undo06BTree 索引结构07分区表08AWR 采集链路09执行计划读取顺序10测试岗学习路线全景
返回列表