细算下来接触Oracle已好多年,之前会因知道一条超有用的统计SQL而欣喜,觉得自己又多了解Oracle一点,而今才知表象是虚无。
熟知Oracle的体系架构,知道Oracle内部是如何工作的,结合业务,才是调优的本质。
想学好Oracle必须掌握的三张图,图一体系架构、图二发起连接示意图、图三处理SQL的示意图,熟知三图-能知道Oracle组件、知道Oracle是如何运行的、也能知道什么组件负责什么事情。
如将项目应用和Oracle关联,每个项目应用都有自己的框架图,也有自己的主流程,Oracle何尝不是如此呢?这么想来Oracle还有什么难学的。
Oracle 由两部分组成 Instance、database。
Instance中两大块:内存(SGA)、进程。
database中三个主要:数据文件、控制文件、redoLog文件
-
Instance
instance数据库实例是一组用于管理数据库文件的内存结构。
当一个实例启动时,Oracle数据库分配内存给SGA,并启动多个后台进程。
SQL> STARTUP
ORACLE instance started.
#读取参数初始化参数配置,并分配内存,启动后台进程,开启告警日志和跟踪文件功能 startup nomount
Total System Global Area 468729856 bytes
Fixed Size 1333556 bytes
Variable Size 440403660 bytes
Database Buffers 16777216 bytes
Redo Buffers 10215424 bytes
#读取它的控制文件与数据库相关联,此时数据库对用户是关闭的。alter database mount
Database mounted.
#关联实例和数据库,并打开数据库。alter database open
Database opened.
1.1 Program global area (PGA)
PGA的使用:
1)为每个用户连接到oracle数据库单独分配的内存
2)进程创建时分配
3)进程结束时回收
4)只能被一个进程使用
分Private SQL Area和SQL Work Areas(sort,hash,Bitmap Merge Area) 一般很少有性能问题。
1.2 System global area (SGA)
SGA的用途包含以下内容:
1)维护由多个进程和线程并发访问的内部数据结构
2)从磁盘读取缓存的数据块
3)在将其写入联机重做日志文件之前缓冲重做数据
4)存储SQL执行计划
Database buffer cache
数据块缓存区是SGA中的一个高速缓存区域,用来存储从数据库中读取数据段的数据块(如表、索引和簇)。
先从此内存区域读取数据-如无数据则从磁盘中读取到内存,再在内存中进行相关操作,然后通过DBW0 写入磁盘,因此内存的命中率直接影响oracle性能,命中率越高表明从内存中取数据概率越大,如需要高的命中率则需要更多的内存--可调优部分
Shared Pool共享池
LIBRARY CACHE(库高速缓存)
1)存储解析过的SQL语句
2)存储执行计划
3)解析和编译PL/ SQL程序单元
Data Dictionary Cache(数据字典)
当SQL过多->碎片多->内存开销大->不方便管理->性能下降。
最常见的硬解析。---可调优部分
Redo log buffer 通常2-3M,记录数据库所有操作前的日志。
Streams Pool、Large Pool、Java Pool 一般不动。
1.3 进程
进程:主要有SMON、PMON、DBWR、LGWR、CKPT等。
-
启动实例建立连接示意图
1)启动instance
- user process (用户发起一个连接)
- server process(为user process服务,连接SGA和datafiles)
-
处理SQL示意图
4) the user update a row
- server process 去SGA 中找记录。
如找到记录跳到7,如如记录则到6。 - server process 去data files读取数据到
- 存入到 database buffer size 更改操作
- redo log files 记录操作
- databases writer (dbw0)将更改写入磁盘
- Server process 反馈结果给user