不论是开发、管理、优化还是设计,对Oracle的基本原理的了解都是必不可少的,于是对自己最近关于Oracle的学习作出一点点的总结。

庖丁解牛之所以能做到“合于桑林之舞,乃中经首之会”,是因为其“所好者道也”。那我们实际的Oracle使用中,了解Oracle的基本体系,也才能对一系列的操作知其然也知其所以然,才能在这个基础上进行相关的优化操作。

开局一张图,内容全靠编。

上图是Oracle的一张基本体系图,简单描述一下大概如下四点:

1.Oracle是由数据库和实例组成的;

2.实例是由一个开辟的共享内存区SGA(System Global Area)和一系列后台进程组成的,其中SGA最主要被划分为共享池(shared pool)、数据缓冲区(db cache)和日志缓冲区(log buffer)三类,后台进程包括但不限于图中列出的PMON等进程;

3.数据库是由数据文件、参数文件、日志文件、控制文件、归档日志文件等系列文件组成的,其中归档日志最终可能会被转移到新的存储介质中,用于备份恢复使用;

4.PGA(Program Global Area)区,也是开辟出来的内存区,但和SGA不同的地方是,PGA不是共享内存,是私有不共享的。用户对数据库发起一系列更删改查操作都是在PGA先预处理,然后才进入实例区域,由SGA和后台进程共同完成用户发起的请求;这其中的预处理主要有三点:一是保存用户的连接信息,如会话属性、绑定变量等;二是保存用户权限等重要信息,当用户进程与数据库建立会话时,系统会将这个用户的相关权限查询出来,然后保存在这个会话区内;三是当发起的指令需要排序的时候,PGA正是这个排序区,如果内存中可以放下排序的尺寸,就在内存PGA区内完成,如果放不下,超出的部分就在临时表空间中完成排序,也就是在磁盘中完成排序;

我们以一条简单的查询语句”select username from tsys_user t where t.user_id = ‘001’”为例,看看这条语句都在Oracle里经历了怎样的旅程。

当用户发起这条SQL指令后,首先在1区做准备工作,获取用户连接信息和权限信息并保存,在连接未断开之前,下次该用户操作数据库时,都是直接从PGA取用户信息。然后为这条SQL生成一个对应的HASH值,然后进入2区;

在2区的共享池中根据这个HASH值查找是否有存储过这条SQL的信息,如果没有,就检查SQL的语法、语义以及是否有权限信息等,检查通过后,估算SQL语句的执行效率,选最高效的执行计划并将hash值和对应的执行计划存储下来。

然后进入数据缓存区去取数,如果数据缓存区有数据,则返回数据,如果没有对应的数据,则去3区的database数据文件中取数,如果查到了就存在数据缓存区,并返回结果,如果没有数据,则查询不到数据。

所以用户的请求发起经历的顺序一般是1区到2区再到3区;或者1区到2区

目前为止,图中的后台进程都未提及。但假如是一条更新语句”update tsys_user  t set t.age = 18 where t.user_id = ‘001’”,在找到对应的数据的时候所经历的步骤都是和select语句一样,更新语句在找到数据之后,在数据缓冲区内修改完数据,然后commit,启用DBWR进程,将数据从内存中刷入磁盘。

所有关于数据库的操作都会记录日志在日志缓冲区,由LGWR进程负责。一般日志文件分成几个小块,第一个小块写满了写到第二个小块,第二个写满写到第三个小块,如此循环至所有小块写满。然后ARCH进程从头开始备份第一个小块到存储介质中,然后LGWR进程重写地一小块日志缓冲区。因为日志缓冲区存储所有的相关操作这个特性,所以Oracle不会每commit一次就将数据写进磁盘,而是批量写进去。而CKPT进程就是调度批量刷进磁盘数据的进程,可以修改CKPT的FAST_START_MTTR_TARGET参数来调整触发CKPT进程。

其中还有PMON进程,是进程监视器,当有进程失败异常或者是崩溃了,会对进程重启或者回滚操作;SMON进程则是系统监视器,关注的是系统级的操作而非单个进程,主要在于数据库实例,此外还有清理临时表空间、清理回滚段表空间和合并空闲空间等;LCKn则是实例间的封锁;RECO则是用于分布式数据库的恢复;

其中LGWR进程,为保证日志记录的顺序性,只能采用单进程,所以LGWR进程每三秒钟运行一次;任何commit触发一次;DBWR将数据从缓存写入磁盘触发一次;日志缓冲区满三分之一或记录满1MB,触发一次;联机日志文件切换触发一次。

重点介绍LGWR进程是因为,所有回滚操作都是建立在日志记录的基础上进行的。

那了解Oracle的体系结构有什么用呢?当然大有所用,有些优化的操作就可以有的放矢了:

1.由于排序是在PGA中进行的,如果PGA放不下排序的数据,甚至要在磁盘中进行,那如果无需排序则不进行排序,如果排序是必须的,且数据量庞大,则可以适当增加PGA的大小。

2.如果数据库很大,访问量很高,可以适当增加共享池的大小,避免很多SQL的解析;相应的,如果数据访问量很小,但数据库服务器内存资源有限,可以不用给SGA开辟很大的内存空间;

3.如果数据库的更新操作频繁,日志文件产生很快且多,可以适当增加日志文件的大小,防止日志块写满,频繁切换日志记录块。

以上只是针对Oracle的基本体系的浅显说明,很多的SQL优化手段都是基于这个基础体系上进行的。下期准备在基础体系的基础上介绍索引的利与弊。如果对我的文章有兴趣,欢迎关注我的公众号“代码狗go”,会不定期更新一些自己的学习所得哦。

Oracle基础体系浅析的更多相关文章

  1. Oracle基础--体系

    1. 连接到Oralce At the operating system prompt, enter the following command to start the SQLCommand Lin ...

  2. [转帖]Oracle 补丁体系(PSR/PSU/CPU) 及 opatch 工具 介绍

    Oracle 补丁体系(PSR/PSU/CPU) 及 opatch 工具 介绍 原文:http://blog.csdn.net/tianlesoftware/article/details/58095 ...

  3. oracle基础教程(8)oracle修改字符集

    oracle基础教程(8)oracle修改字符集 1.用dba连接数据库 -->sqlplus / as sysdba 2.查看字符集 -->SELECT parameter, value ...

  4. Oracle 10g体系机构及安全管理《思维导图》

    通过学习Oracle数据库后,我对数据库又有了进一步的了解,Oracle数据库 10g体系机构分为 物理和逻辑存储结构. 下面是我对Oracle数据库做的思维导图和笔记 (全屏查看:<思维导图& ...

  5. 图说Oracle基础知识(一)

    本文主要对Oralce数据库操作的基础知识进行一下梳理,以便进行归纳总结.适用于未使用过Oracle数据库的读者,或需要学习Oracle数据库方面的基础知识.如有不足之处,还请指正. 关于SQL介绍的 ...

  6. oracle基础教程oracle客户端详解

    oracle基础教程oracle客户端工具详解 参考网址:http://www.oraclejsq.com/article/010100114.html 该教程介绍了oracle自带客户端sqlplu ...

  7. Oracle基础 表分区

    Oracle基础 表分区 一.表分区 (一)表分区的分类 1.范围分区(range) 2.散列分区(hash) 3.列表分区(list) 4.复合分区:范围-哈希(range-hash).范围-列表( ...

  8. Oracle基础了解

    数据库: 关系型数据库 select * from 表名 非关系型数据库(做不到复杂查询) 以对象的形式进行存储 {"aaa":"ccc"}---键值对 ora ...

  9. Oracle 逻辑体系

    Oracle 逻辑体系 主题 Oracle 逻辑体系 参考资料   Oracle 逻辑体系   表空间.模式.用户.段.区.块 Oracle中的数据逻辑上存储于表空间,物理上则存储于属于表空间tabl ...

随机推荐

  1. java常用工具包

    1.国外 org.apache.commons.lang3 http://commons.apache.org/proper/commons-lang/javadocs/api-3.8.1/index ...

  2. APICloud · 跨越2018,技术改变世界

    在APICloud发展轨迹中, 2018注定是疾速的一年, 更多的风口趋势和现象级应用背后, 是技术在推动着世界的加速转动. APICloud所提供的技术服务,在混合之力的驱动下不断完善升级,“让你的 ...

  3. Vue.js中使用select选择下拉框

    在Vue.js中使用select选择下拉框有两种方法: 第一种: Add.html: <select v-model="sysNotice.noticeType" id=&q ...

  4. Elasticsearch学习笔记(十四)relevance score相关性评分的计算(1)

    一.多shard场景下relevance score不准确问题     1.问题描述:            多个shard下,如果每个shard包含指定搜索条件的document数量不均匀的情况下, ...

  5. Logstash安装介绍

    前言 logstash是ELK日志系统中的一部分,主要承担将收集完成日志进行过滤,并且输出到es的职责. logstash本身也可以作为客户端部署到应用系统的服务器上进行日志收集,但是由于资源开销占用 ...

  6. 解决nohup中不写入日志的问题

    (一)问题描述: nohup 你的程序命令 如: nohup python manage.py runserver 0.0.0.0:6789   (此shell窗口1不要关,另外开一个shell窗口2 ...

  7. kubernetes集群应用部署实例

    今天,我们将要带来入门hello world示例,它是一个web留言板应用,基于PHP+Redis的两层分布式架构的web应用,前端PHP web网站通过访问后端Redis数据库完成用户留言的查询和添 ...

  8. selenium 对浏览器标签页进行关闭和切换

    关闭标签页 # 1.关闭浏览器全部标签页 driver.quit() # 2.关闭当前标签页(从标签页A打开新的标签页B,关闭标签页A) driver.close() 切换标签页 from selen ...

  9. 解决git pull/push每次都需要输入密码问题 和 HttpRequestException encountered

    如果我们git clone的下载代码的时候是连接的https://而不是git@git (ssh)的形式,当我们操作git pull/push到远程的时候,总是提示我们输入账号和密码才能操作成功,频繁 ...

  10. Java 基础 IO流之序列化

    一,前言 在前面的IO中,我们都是讲数据以字符串的形式保存.能不能将一个数组保存到文件呢,当取出数据时也是一个数组,如果能够实现那就完美了.我们都知道比较通用的有JSON格式的序列化,那java中也有 ...