zoukankan      html  css  js  c++  java
  • Oracle体系结构概述与SQL解析剖析

    Oracle服务器

    是一个数据库管理系统,它提供了一种全面、开放、集成的方法来管理信息。

    Oracle服务器由Oracle数据库Oracle实例组成。

    oracle数据库软件和Oracle数据库软件可以分开存储。oracle数据库软件一般存放在oralce服务器的本地硬盘上,而Oracle数据库实例所对应的文件(.ctl、.log、.dbf)一般存放在存储服务器上。

    一个常用的冗余结构如下图所示:

    Oracle体系结构

    体系结构图

    image-20201012222031922

    存储服务器

    实例和数据库的关系

    一个Oracle数据库可以对应多个数据库实例。对于数据库实例a、b,和数据库db1,如果有1万个用户连接数据库db1,则其中5千个用户连接到实例a,5千个用户连接到实例b(RAC技术)。

    数据库结构

    image-20201013084158038

    Oracle内存结构

    与Oracle相关联的内存结构包括:

    • 系统全局区(SGA):由所有服务器进程后台进程共享

    • 程序全局区(PGA): 专用于每一个服务器进程或后台进程,每一个进程使用一个PGA。

    SGA是包含了数据库实例控制信息和数据的内存区。

    image-20201013084249130

    其中,我们需要着重关心的是共享池(Share Pool)和数据库缓冲区高速缓存(Database buffer cache)。

    SGA包含的数据结构:

    • 共享池:缓存可在各个用户之间共享的各个结构;(SQL语句以及对应的执行计划)

    • Streams 池:由Oracle Streams使用;

    • 大型池:这是一个可选的区域,可为某些大型进程(如Oeacle的备份和恢复操作、I/O服务器进程)提供大量内存分配;

    • Java池:用于Java虚拟机(JVM)中特定会话的所有Java代码和数据;

    • 数据库缓冲区高速缓存:缓存从数据库检索的数据块

    • 重做日志缓冲区:高速缓存重做信息(用于实例恢复),直到可以将其写入磁盘中存储的物理重做日志

    Oracle进程结构

    image-20201013091622609

    对于每一个用户进程,oracle服务器都会建立一个与之对应的服务器进程。也就是说当前如果有100个用户与oracle服务器进行连接,那么,oracle将建立100个服务器进程来处理用户连接。

    Oracle实例管理

    • 控制文件:记录了各文件存放的位置以及当前的运行状态;

    • 数据文件:存放数据;

    • 重做日志文件:对数据文件所有的修改记录;

    • 系统监视器: 出现故障后,在启动实例时执行崩溃恢复任务,对共享池中存在的内存碎片进行整理。

    • 进程监视器: 用户进程失败时,执行进程清理任务;对sql process进行整理。

    • 数据库写进程:将数据库缓冲区高速缓存中修改后的的数据块写入数据文件;

    • 日志写进程:

      ​ 触发条件:

      • 当某个事务提交时
      • 当重做日志缓冲区中变化的记录超过1MB时
      • 当重做日志缓冲区中所存的记录已超过缓冲区容量的1/3
      • 在DBWR将数据库高速缓冲区中修改过的数据块写到数据文件之前
      • 每3秒钟

      归档进程: 发生日志切换时将重做日志文件复制到归档存储器

      检查点: 通过更新所有数据文件的和控制文件指出新的检查点

    Oracle数据库服务器由Oracle数据库和Oracle实例组成,Oracle实例由系统全局区SGA的内存结构和后台进程组成。这些后台进程可以处理运行实例时所涉及到的大量后台任务。

    物理数据库结构

    image-20201013211923980

    SQL解析剖析

    读数据

    1. 客户端输入SQL语句

    2. SQL语句通过网络到达数据库实例

    3. server process接收SQL语句

      3.1 判断SQL在Shared Pool中是否存在缓存

      ​ a. 如果有,则在shared pool中找到对应的sql语句以及对应的执行计划,然后再去执行

      ​ b. 执行3.1

      3.1 SQL解析成执行计划,然后才能执行

      解析流程:

      ​ a. 判断SQL语法是否存在问题

      ​ b. 判断SQL对应的表、视图是否存在

      ​ c. 判断用户是否有对应表、视图的权限

      ​ d. 判断如何执行(挑出最优的执行计划作为执行计划,最费时间,耗费CPU,I/O资源)

      ​ e. 选择最优执行方案生成执行计划

      3.1 执行SQL

      SQL Process根据SQL语句对应的执行计划,执行SQL,读取高速缓存,如果缓存中存在数据,则将缓存中的数据返回给用户,否则读取dbf中的数据并将数据存入缓存,然后将数据返回给用户。

      逻辑读:从内存中读取数据

      物理读:从物理磁盘中读取数据

    缓存命中率: 命中率低一定有问题,命中率高不一定没问题。

    比起缓存命中率,我们更关心每秒物理读。

    写数据

    sql process 将表读到内存中,然后再对表进行修改。Oracle数据库对dbf文件的修改都会强日志。

    数据库写进程(DBWn)负责将修改后的数据写入数据文件dbf。

    日志写进程(LGWR)将日志写入日志文件。

    (单一职责原则)

    软解析和硬解析

    软解析: 从高速缓存中获取执行计划

    硬解析:对SQL process接收到的SQL进行解析,判断sql语法,查询的表是否存在,是否有权限,判断如何执行(挑出最优的执行计划作为执行计划,最费时间,耗费CPU,I/O资源);

    SQL Process执行sql后,会将数据放入高速缓存,再由DBRn和LGER分别写入数据文件dbf和日志文件log。因此,对于用户来说,数据库响应快慢由SQL Process直接影响。哪怕DBRn和LOWR两个进程再繁忙,用户也是感受不到的。

    服务器进程和数据库缓冲区高速缓冲

    image-20201013205817180

    算法 :使用最近最少使用算法管理缓冲区

    高速缓冲区状态

    • 空闲或未使用:实例刚启动,缓冲区为空
    • 已连接: SQL Process正在对内存中的数据进行读写操作。其他会话正在等待
    • 脏数据 :缓冲中的数据和磁盘中的数据不一致(对缓冲中的数据进行了修改,但是还没有写入磁盘)。需要先将脏数据写入磁盘才能腾出缓冲区。
    • 干净的 :缓冲区已解除连接。如果没有再次使用当前内容(数据块),现在可以考虑立即腾出缓冲区。此时,不是缓冲区中的数据快已经同磁盘中的数据保持同步,就是缓冲区中包含对数据快的读取一致性快照。
  • 相关阅读:
    php或JS中输出判断项
    拿大神的博客来记一下
    2017.6.8 项目进展
    2017.6.8
    2017.5.18
    2017.5.17
    2017.5.16
    如何实现从php传数据到js
    项目笔记
    tp框架之Model类与命名空间
  • 原文地址:https://www.cnblogs.com/bingfengdev/p/13811642.html
Copyright © 2011-2022 走看看