概述
oracle学习笔记 PGA内存作用和构成
从这节课开始讲oracle非常重要的一个内存结构PGA
一)pga也非常重要
oracle的内存分两大块
一块是SGA,
里面有六个池子
Shared pool,Streams pool,Large pool,Java pool,Database buffer cache,Redo log buffer
另外一块是PGA
大家会发现在市面上好多书里面
讲SGA讲了很多,但是PGA讲的很少
老师很奇怪
对oralce的实例来讲
有sga有后台进程,有pga有serverprocess
大家书上花了很多的力气很多的篇幅去讲sga去讲后台进程
但是对serverprocess和pga讲的相对很少
但在实际的工作中
pga和serverprocess是最容易出问题的
我们来解决问题的时候和我们去发现问题的时候
往往是从pga和serverprocess入手
所以老师讲课的时候
把很多的精力给大家讲pga去讲serverprocess
所以今天讲的pga非常重要
但是pga管理起来相对比较容易一些
在pga里面发现问题也比较容易一些
所以说这块内容不是很难但是非常重要
抛出第一个问题oralce数据库里面有两个东西很重要
serverprocess和pga
二)计算机语言和计算机的问题及错误
这里老师又讲到软件经常出问题
问题和错误是计算机及其软件避免不了的
究竟是什么原因引起来的
可以从软件的基础-计算机语言来剖析这个问题
计算机硬件整体来讲它是一台机器,是一台电子机器
它由高低电平驱动
而且处理的是数字0和1
内存和处理器中以高低电平来表示1和0
磁盘中以磁场表示1和0
它所具有的处理能力
是制造者在制造它时赋予它的
如它可以存储数据、执行命令和进行运算
使用者所看到的都是由0和1经过计算得到的结果
如文字和图片
这个机器要运行需要人来启动,并时时需要人的操作
它所拥有的固有处理能力
是一些最基本的操作
如数据的传输和加减运算等
它们经过组合形成了更大的功能
为了处理希望的更强大的功能
这些基础处理和其组合经过了一代代的完善、精化
结果形成了以超大规模集成电路为基础的各种芯片
它的每种基础操作
都是以0和1来表示的
由0和1来控制由0和1来找数据和由0和1来计算
这就是计算机机器的语言基础
每个基础工作都由0和1构成
再由一个个的这种基础语句构成机器语言体系
在机器内部运行
虽然机器语言是人创造的
但是人想直接看出这些0和1到底在干什么
不使用工具是做不到的更不要说编写它
所以必须有人可以看懂的语言和它对应,来理解它和编写它
就有了汇编语言
它不是0和1组成,是由人可以理解的词语组成
它仍然晦涩难懂,但是人经过努力是可以看懂的
它的每一句也表示机器的一个基础动作
每条汇编语言经过编译得到一条机器语句
最终在计算机运行的仍是机器语言
汇编语言仍然不适合人的使用习惯
但是它是人操作计算机的必须途径
为了实现大规模运算和人更容易的控制计算机
不同的人根据自己的理解集成优化最底层计算机执行的指令
又形成了各种高级语言
因为基础硬件基本一致
人类的思维方式也基本一致
所以各种高级语言的结构和语法也是基本一致的
高级语言在编写程序时相对非常的方便
要让它在计算机中运行
要先汇编成汇编语言,然后再编译成机器语言
当机器语言得到运行时
计算机各种语言才达到它的最终目的
机器语言、汇编语言和高级语言就是通常人们所说的计算机语言。
它们都在表达计算机做什么。
在操作计算机时,我们对计算机呈献出来的内容
如一个图片,一段文字或者一个对话框
我们会产生反应
如关闭它,保存它或者要进入下一步的操作
我们需要点击鼠标或操作键盘给它回应
这种交互
其实也是和计算机的一种交流
是计算机抽象意义下的一种语言。
计算机语言和人类说话用的语言
都是表达人类的意图和进行传递信息
只是计算机语言是把人的意图告诉给计算机
每种语言作为一种语言它有它的体系和作为一种语言的难度
要使用它必须一步步的学习
首先要看懂它然后再使用它
当计算机运行起来,
它就是编写程序者的思维
另一个使用者同样可以和这个程序交流
不过这种交流相对死板
被套在固定的模式下和实现了的设定的方面
原因是一个程序的局限性
再怎么全面也只能设定现实世界的很少一部分
也是现在所有智能化技术无法突破的限制
计算机总是被操作的,视为自动化程度很高的工具可以理解它到底能做什么
人无完人,人总是会出错的
人所编写的程序也会出错
这样会使计算机产生意想不到的结果
如果你不了解计算机语言
就无法和计算机沟通
或者无法编写在计算机上可以运行的程序
每个使用计算机语言编写程序的人都是有局限性的
每种语言表达事物同样都是有局限性的
它所编写出的程序当然也是有局限性的
避免不了编写中自己的片面造成的程序的不完整和错误
在很多没有考虑到的方面往往会出现各种各样的问题
这样就可能产生编写的问题和错误
理论上讲在程序编写、静止和执行时
每一个指令和数据都是可以被修改的
可人为的修改或硬件产生错误造成的修改
这样就可能产生出运行时的错误
计算机中每个程序只是在计算机整体程序的一部分
和其它的程序有相互依存的关系
在和其它程序同时运行时
相互间避免不了矛盾和冲突
这样就可能产生环境错误
程序编写后还要由人来使用
别人使用要适应编写者的思路
要理解程序的功能
别人的不习惯和不理解一样产生这样那样的问题
这些问题和错误的根本就产生在由计算机语言编写、构成和运行程序的过程
根源在计算机语言的使用者和运行者
人类所有语言在表达事物时
想做到完全正确没有遗误是不现实的
没有人可以做到
使用计算机的灵魂计算机语言也一样
这就是计算机问题和错误产生的根本。
oracle也由计算机语言组成
就现在说的它的serverprocess组件来说
虽然产生年代已很久远
它在编写时同样的肯定做不到完美,肯定有编写上的疏忽
再加上不断的升级修改也会造成代码的混乱
运行时不管什么样的硬件一样会产生错误
但就现在使用情况来说
它的问题和错误主要还是产生在
和周边功能代码的相互使用上
如和SGA和PGA的相互使用。
使用的长了就知道它们相互间的关系有多复杂和费解
既要适应程序的思路又要了解计算机的知识
对程序本身和对它的使用的问题和错误也一直不可避免的发生着。
三)PGA内存空间的位置
内存中有
buffercache logbuffer sharedpool
有一堆后台进程
DBWr,smonitor,pmonitor,checkpoint,logwrite
硬盘上有dbf文件,redolog文件、还有archivelog
外部链接产生serverprocess,它有pga
这就是oracle的一个体系结构
平时在一般的书上五个后台进程讲的很多
SGA讲的也很多
唯独PGA和这一堆serverprocess讲的很少
实际上这是重点
工作中这是要理解的重点
pga叫私有全局区或者叫程序全局区
sga叫共享全局区或者系统全局区
无论是serverprocess还是后台进程
它们都可以访问sga这块内存区域
sga是共享的一块内存区域
pga属于每一个进程
后台进程也有pga空间
就是每一个进程都有一块内存空间
只不过后台进程占的内存空间比较小我们不怎么关心它
主要是serverprocess的pga它占的空间是比较大的,有时候会是很大
而且还有多种问题
serverprocess数量众多,动辄上百一二百
有的一个数据库的serverprocess数量达到二百
但是后台进程就十来个左右
所以我们重点研究serverprocess以及它的pga
每一个进程占用一块pga内存空间
这块pga是专门的为serverprocess服务的
一个pga空间只能它对应的那个serverprocess可以访问
只有一个serverprocess可以访问它的pga内存空间
也就是一个pga的内存空间作用非常简单
存储的是和对应session会话相关的一些数据
没有共享
我们平时主要研究serverprocess的pga
四)PGA的构成
pga有很多部分构成
有private sql area
有session memory
还有sql work areas
这三块里面可以详细看一下
但实际上没有大的意义
我们看pga空间大家记住一句话就ok了
一个会话,它的pga空间
其实就是这个会话的工作区
这个pga里面绝大部分空间放的是和这个会话相关的一些工作区
会话主要干的事情是执行sql
也就是sql工作相关的一些数据放到pga里面
虽然说pga里面有很多空间
如 私有sql区 session memory
但主要是sql工作区
另外两块现在不去理他
它和我们的优化和性能关系不大
实际上对我们来讲pga我们主要研究工作区
研究pga实际上就是研究pga的sql工作区
就是这个serverprocess在执行sql的时候
它需要一个自己的工作空间
就是如一个办公室
每人有一个桌子,桌子后面有一块自己的空间
这个空间称为我们的工作区
比如我们办公室有一个我们喝茶水的地方
对大家讲是共享的
是一个道理
研究pga就是研究每一个session的每一个会话的sql工作区
这就是pga的构成
五)SQL工作区的组成
这个sql工作区都有哪些部分组成这是我们要讲的
sql工作区主要有sort area、hash area和bitmap相关的几个area
它里面有分成几大块
有sort排序区,有hash区,还有位图相关的位图区
这三块区
oracle的结构
有buffercache logbuffer
对应磁盘dbf redolog
从客户来的session,和session的pga
我们通过session执行一个sql语句
SQL> select * from t2;
ID NAME
---------- --------------------
1 xkj
2 jiagulun
这是一个sql语句
数据返回来了
执行另外一个sql语句
SQL> select * from t2 order by id desc;
ID NAME
---------- --------------------
2 jiagulun
1 xkj
以id的降序把数据从t2里面取出来
第一个语句随机的把数据取出来
第二个进行了排序
这两个sql语句有什么不一样?
第一个sql语句随机取数据oracle怎么取呢
select * from t;语句
t表实际只有两行但假设有一万行数据
第一、如果没有排序
dbf中的block调到内存里面去
假设数据在很多的block里面
它会把block一个一个调到内存里面去
然后从第一个block开始取数据
取出一行
取出后因为没有排序
直接取出一行返回一行
取出一行返回用户一行
这是没有排序
这时的pga空间几乎没有什么意义没有什么作用
因为数据从buffer里面取出来以后直接返给我们的客户
只是经过了pga一下
这是没有排序
第二、有排序时
排序时会出现
在会话的pga空间
排序时取一万行数据是
一万行数据取出来排好序以后返给用户
这时oracle会首先从buffer里面把数据取出来
取出以后不会直接返给用户
一万行取出来以后
放到pga里面去,在pga里面排序
因为pga是这个会话的一个工作空间
取出一万数据以后会放到pga里面去
利用pga的空间缓存这一万行数据然后在pga里面进行排序
排完序以后返给用户
pga的第一个作用sort排序
所以pga里面一定会有一部分空间
是专门系统来排序的
这块我们叫sort_area_size
比如我需要排序的时候
sort_area_size有两兆的空间
我需要5M的空间来排序
这时sort_area_size会增加
在内存空间可用的情况下
sort_area_size会增加到5M
排完序以后sort_area_size会释放空间
释放到什么程度
有另外一个参数
sort_area_retained_size
比如sort_area_retained_size设到2M
sort_area_size释放到2M的时候就不继续释放了就停了
这是最低保留的空间
这是排序区
另外还有一个hash区
oracle是个关系型数据库
就是表和表之间有关系
我们经常会从两个表或三个表里面同时取数据
比如我想同时从三个表里面取数据
这时我们就可能需要对三个表进行hash join
hash连接的时候就会用到hash area
用到hash_area_size
在oracle数据库里面很少出现单独访问一个表的情况
一般都访问多个表
访问多个表大部分情况会出现hash连接
hash连接就需要pga空间
记住oracle执行sql语句的时候
有两个特色
第一个特色绝大部分情况下是多表同时访问
就会用到hash
同时我们在访问数据的时候
绝大部分的情况下我会加orderby会加排序
我们排完序以后把数据返给用户的时候,用户看到后更加友好
所以在大部分sql语句里面会有排序会有hash连接
所以pga里面的hash join和sort area size
这两个空间很重要
我们要时刻关注这个空间够不够
我们很关注一个话题pga空间不够以后我们该去怎么办
刚才讲了关于pga的作用和内存构成
下节再讲pga的管理方式
就会涉及到内存空间不够了以后怎么办等等一些内容
文字:韵筝
2017年1月9日
最后
以上就是无限时光为你收集整理的oracle学习笔记 PGA内存作用和构成oracle学习笔记 PGA内存作用和构成的全部内容,希望文章能够帮你解决oracle学习笔记 PGA内存作用和构成oracle学习笔记 PGA内存作用和构成所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复