oracle资料库
shell脚本命令
MySQL资料
Linux 安装mariadb
MySQL安装部署四种安装方式
Linux操作系统彻底删除MySQL——详细步骤
windows 下安装Mysql
MySQL常用命令
sqlite
Oracle
运行情况查询汇总
通过命令行导出AWR报告
alert日志存放位置
归档日志查看与清理
oracle数据库体系结构
SPFILE的搜索顺序
备份还原
RMAN备份
数据泵备份
EXP/IMP
数据库自动任务
oracle部署安装
Linux下安装oracle11G
windows下安装数据库
数据库维护篇
SGA/PGA修改
单独BUG参数修改
常用参数修改命令
数据库异常情况典型
用户密码管理
TNS详解及常见错误码
SQL语句
练习题
练习二
oracle 数据库去重复
多行字段拼接成一列 (listagg函数)
判断是否为数字
数据库空间管理
lob字段压缩
碎片整理
临时表空间
临时表空间管理
Oracle服务脱机迁移手册
windows 磁盘空间不足 转移数据文件
常用函数
发现患者是否有特殊字符
获取汉字首拼
通过关键词截取病历数据
转入转出文书记录获取数据
blob转varchar
触发器
阻断休眠
性别被置空
姓名无故更新
健康检测脚本
数据闪回
Redis
Redis可视化工具
Toad使用技巧
本文档使用 MrDoc 发布
-
+
首页
oracle数据库体系结构
# 1 概述 ORACLE体系结构主要分为: - 内存结构(SGA、PGA) - 进程结构(用户进程、服务器进程、后台进程) - 存储结构(逻辑存储、物理存储)  # 2 内存结构(SGA、PGA)   ## 2.1 SGA概述  ```sql select * from v$sga; --内存结构的摘要信息,name是sga内存区的名字,value是内存区的值 select * from v$sgastat; --内存分配的细节 select * from v$sgainfo; --内存分配的详细信息 show parameter sga; --输出sga相关参数 sga_target=0; --等于0表示禁用自动SGA内存管理 sga_max_target=392m; --sga内存的最大值 select * from v$sga_target_advice; --用于建议sga设置大小是否合理 //sga_size是sga的期望大小;sga_size_factor是期望sga大小与实际sga大小的百分比;estd_db_time是sga设置为期望的大小后,其dbtime消耗期望的变化;estd_physical_reads是修改前后物理读的差值 ``` ### 2.1.1 Database Buffer Cache(数据库缓冲区高速缓存) - 服务器进程,针对每一个连接启动一个服务器进程; - 数据在Buffer cache,如果没有就找dbf数据文件; - dbw数据库写进程将修改后的数据写入数据文件。 Database Buffer Cache用于存储从磁盘数据文件中读入的数据,为所有用户共享。 Server Process(服务器进程)将读入的数据保存在数据缓冲区中,当后续的请求需要这些数据时可以在内存中找到,则不需要再从磁盘读取。 **逻辑读(从内存读)的速度是物理读(从磁盘读)的1万倍呦,所以还是想办法尽量多从内存读哦。 所以,数据缓冲区的大小对数据库的读取速度有直接的影响。** Database Buffer Cache的设计思想 磁盘上存储的是块(block),文件都有文件号,块也有块号。 若要访问磁盘上的块,并不是CPU拿到指令后直接访问磁盘,而是先把块读到内存中的Database Buffer cache里,生成副本,查询或增删改都是对内存中的副本进行操作。如图所示。 另外,如果是增删操作,操作后会形成脏块,脏块会在恰当时机再写回磁盘原位置,注意哦,可不是立刻写回呦。 也许你会问,为什么不立刻写回呢? 因为: (1)减少物理IO; (2)可共享,若后面又有对该块的访问,可直接在内存中进行逻辑读。  如果在 Database Buffer Cache 中存放大量未来得及写回磁盘的脏块时,突然出现系统故障(比如断电),导致内存中的数据丢失。而此时磁盘中的块存放的依然是修改前的旧数据,这样岂不是导致前面的修改无效? 要怎样保持事务的一致性呢? 答:如果我们能够保存住提交的记录,在 Database Buffer Cache 中一旦有数据更改,马上写入一个地方记录下来,不就可以保证事务一致性了嘛。Instance在断电时会消失,Instance在内存中存放的数据将丢失。这就需要 Redo Log Buffer 发挥它的作用啦。 ```sql select name,value from v$sysstat where name in ('db block gets from cache','consistent gets from cache','physical reads cache'); db_cache命中率=1-(physical reads cache/(db block gets from cache+consistent gets from cache)) select name,physical_reads,db_block_gets,consistent_gets,1-(physical_reads/(db_block_gets+consistent_gets))hitratio from v$buffer_pool_statistics;//推导缓冲区高速缓存的命中率 select * from v$dba_cache_advice; //用于建议缓冲区高速缓存设置 ``` ### 2.1.2 Redo Log Buffer - buffer cache中的数据一旦有修改就会产生该日志; - LGWR将Log Buffer写入redo log中,写满后进行切换; - ARCn将redo log归档到归档日志。 日志条目(Redo Entries )记录了数据库的所有修改信息(包括 DML 和 DDL),一条Redo Entries记录一次对数据库的改变 ,为的是数据库恢复。 日志条目首先产生于日志缓冲区。日志缓冲区较小,它是以字节为单位的,它极其重要。 在Database Buffer Cache中一旦有数据更改,马上写入Redo Log Buffer,Redo Log Buffer在内存中保留一段时间后,会写入磁盘,然后归档 ```sql show parameter log_buffer; //log_buffer决定redo log buffer的大小 select * from v$sgastat where name='log_buffer'; ``` ### 2.1.3 Share Pool(共享池) ```sql select * from v$shared_pool_advice; //用户建议共享池大小的设置 //shared_pool_size_for_estimate是估算的共享池的大小;shared_pool_size_factor是估算的共享池大小与当前大小比; //estd_lc_size是估算共享池中用于库缓存的大小;estd_lc_memory_object_hits是估算的可以直接从共享池中命中的内存对象的命中次数。 select * from v$shared_pool_reserved; //存放共享池中保留区的统计信息 //free_space是保留区的空闲空间数;avg_free_size是保留区的空闲空间平均数;free_count是保留区的空闲内存块数;used_space是保留区使用空间数; //以上字段只有shared_pool_reserved设置了才有效 ``` #### 2.1.3.1 Library Cache(库高速缓存) 用于存储SQL语句及相关的解析,执行计划,PL/SQL程序块等。 ```sql select * from v$db_object_cache; //显示所有被缓存在library cache中的对象,包括表、索引、PL/SQL存储过程、包和触发器。 //name是对象名称;dblink是对象的dblink名称;namespace是库缓存的对象命名空间;type是对象类型;locks是当前多住这个对象的用户数; v$sql、v$sqlarea、v$sqltext都可用于查询共享池中已经解析过的SQL语句及其相关信息; select * from librarycache; //包含关于library cache的性能统计信息 //namespace是library cache的命名空间;gets是请求该命名空间中对象的次数;gethitratio请求get的命中率;pins读取或执行该命中对象的次数;reloads是pin请求从磁盘中载入对象的次数 ``` #### 2.1.3.2 Data Directory Cache(数据字典缓存) 存放数据字典信息,包括表、视图等对象的结构信息,用户以及对象权限 ### 2.1.4 Large Pool(大池) 用于RMAN备份;执行大量查询;执行大量排序操作;共享服务器。 ```sql show parameter large_pool_size; ``` ### 2.1.5 Java Pool(Java池) 用于存储所有回话中特定Java代码和JVM中数据 ```sql show parameter java_pool_size; select * from v$java_pool_advice; //查询建议统计数据 ``` ### 2.1.6 Stream Pool(流池) 如果设置了sga_target,oracle会从sga中分配内存给流池;如果没有指定sga_target,则从buffer cache中转换一部分内存给流池 ```sql show parameter stream_pool_size; select * from v$stream_pool_advice; //查询建议统计数据 ``` ## 2.2 PGA(程序全局区) ```sql select name,value from v$pgastat where name in('maximun PGA allocated','total PGA allocated'); //查看当前pga的分配情况 show parameter pga; //pga_aggregate_target非0时启用pga自动管理 ``` (1)Private SQL area(私有SQL区) 包含绑定信息、运行时的内存结构,每个发出SQL语句的绘画,都有一个私有SQL区。 (2)Session memory 为保存会话中的变量以及其他与会话相关的信息,而分配的内存 # 3. 进程结构(用户进程、服务器进程、后台进程)
孙端己
2024年9月20日 11:46
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码