写在前面

作为开发人员,掌握数据库是必不可少的一件事情,当你已经对数据库系统的基本理论知识和基本的SQL语句有所掌握时,理所应当去深入学习一种数据库系统,以便在开发中能加以运用。就目前而言,市场上常见的数据库有以下这些。
数据库系统分类
你大可不必为应当学习以上哪种数据库系统而烦恼,当你的数据库理论及基本的SQL语法掌握后,学习哪种数据库系统对你而言应当不再是难事。
今天,我们就市场占据市场份额较多的关系型数据库–Oracle为例作为讲解,本章主要从架构上面分析,希望可以起到高屋建瓴的效果。

企业级常用数据库—Oracle

下面我们先来看下面这幅常见的架构图
Oracle架构图
由图可看出来,Oracle数据库实例(Instance)是由一系列内存结构及后台结构组成。内存结构主要是SGA(System Global Area,系统区全局区)和PGA(Program Global Area,程序全局区)组成,后台进程则主要是一系列进程监控进程(PMON)、系统监控进程(SMON)、数据库写入进程(DBWR)、日志写入进程(LGWR)、检查点进程(CKPT),以及一些其他进程组成。本文主要讲述内存结构的组成及原理。

SGA

SGA是什么呢,总的来说是Oracle分配的一种共享内存结构,用户对数据库的各种操作主要在SGA中进行。下面我们来看下如何查看系统的SGA。

  • 首先,在sqlplus中以免密的方式登录数据库
C:\Users\Administrator>sqlplus / as sysdba
  • 然后执行下面命令,便可以看到系统SGA的基本情况
SQL> show parameter sga

NAME                                 TYPE        VALUE
------------------------------------ ----------- -----
lock_sga                             boolean     FALSE
pre_page_sga                         boolean     FALSE
sga_max_size                         big integer 1G
sga_target                           big integer 0
  • 当然你也可以选择修改里面的参数,例如
SQL>alter system set sga_target=436M;
  • 或者,
SQL> alter system set sga_max_size=436M scope=spfile;
  • 你只需要重启数据库即可使上面的命令生效
SQL>shutdown immediate
SQL>startup

但是,我并不建议你这样做,SGA通常在数据库系统建立之初就分配好。好了,下面我再来讲述SGA的主要组成部分

1.Database Buffer Cache(数据高速缓冲区)

在现代数据库中,设立数据高速缓冲区基本是必不可少的,为了避免数据库等待磁盘I/O,Oracle设计了数据库高速缓冲区,暂时存放用户执行查询语句时从数据文件(磁盘)读取出来的数据,避免了直接对磁盘I/O,并被当前实例的其他用户共享。下面我们来看下其原理图
在这里插入图片描述

当发生SQL查询时,在共享池的服务器结果缓冲区里找不到结果,那么就会到数据库高速缓冲区里查找,如果有,则产生缓冲命中(Cache Hit),读取保持池,否则产生缓冲失误(Cache Miss),可能会读取默认池或者回收池,还有一种情况,如果在数据库高速缓冲区里找了很久,直到临界点,那么就会通知DBWR进程,将回收池里的脏缓冲器写入磁盘,再将默认池里的空闲缓冲器转移到回收池,变为脏缓冲器。
在数据库优化一块便有对数据高速缓冲区的优化,在这我不做过多讲解,下面我们来了解一下其常用的视图即可

  • v$db_cache_advice视图,Oracle自动收集的相关统计数据,并预测出DB_CACHE_SIZE在不同大小情况下的性能数据
SQL> desc v$db_cache_advice
 名称                                      是否为空? 类型
 ----------------------------------------- -------- ------------
 ID                                                 NUMBER
 NAME                                               VARCHAR2(20)
 BLOCK_SIZE                                         NUMBER
 ADVICE_STATUS                                      VARCHAR2(3)
 SIZE_FOR_ESTIMATE                                  NUMBER
 SIZE_FACTOR                                        NUMBER
 BUFFERS_FOR_ESTIMATE                               NUMBER
 ESTD_PHYSICAL_READ_FACTOR                          NUMBER
 ESTD_PHYSICAL_READS                                NUMBER
 ESTD_PHYSICAL_READ_TIME                            NUMBER
 ESTD_PCT_OF_DB_TIME_FOR_READS                      NUMBER
 ESTD_CLUSTER_READS                                 NUMBER
 ESTD_CLUSTER_READ_TIME                             NUMBER
  • v$bh视图,查询消耗数据库高速缓存区的对象
SQL> desc v$bh
名称                                      是否为空? 类型
----------------------------------------- -------- ------------
FILE#                                              NUMBER
BLOCK#                                             NUMBER
CLASS#                                             NUMBER
STATUS                                             VARCHAR2(10)
XNC                                                NUMBER
FORCED_READS                                       NUMBER
FORCED_WRITES                                      NUMBER
LOCK_ELEMENT_ADDR                                  RAW(4)
LOCK_ELEMENT_NAME                                  NUMBER
LOCK_ELEMENT_CLASS                                 NUMBER
DIRTY                                              VARCHAR2(1)
TEMP                                               VARCHAR2(1)
PING                                               VARCHAR2(1)
STALE                                              VARCHAR2(1)
DIRECT                                             VARCHAR2(1)
NEW                                                CHAR(1)
OBJD                                               NUMBER
TS#                                                NUMBER
LOBID                                              NUMBER
CACHEHINT                                          NUMBER
  • v$buffer_pool视图,主要是里面不同分区的详细情况
SQL> desc v$buffer_pool
名称                                      是否为空? 类型
----------------------------------------- -------- ------------
ID                                                 NUMBER
NAME                                               VARCHAR2(20)
BLOCK_SIZE                                         NUMBER
RESIZE_STATE                                       VARCHAR2(10)
CURRENT_SIZE                                       NUMBER
BUFFERS                                            NUMBER
TARGET_SIZE                                        NUMBER
TARGET_BUFFERS                                     NUMBER
PREV_SIZE                                          NUMBER
PREV_BUFFERS                                       NUMBER
LO_BNUM                                            NUMBER
HI_BNUM                                            NUMBER
LO_SETID                                           NUMBER
HI_SETID                                           NUMBER
SET_COUNT                                          NUMBER
  • v$buffer_pool_statistics视图,主要是查看高速缓冲区和分区的命中率情况
SQL> desc v$buffer_pool_statistics
名称                                      是否为空? 类型
----------------------------------------- -------- ------------
ID                                                 NUMBER
NAME                                               VARCHAR2(20)
BLOCK_SIZE                                         NUMBER
SET_MSIZE                                          NUMBER
CNUM_REPL                                          NUMBER
CNUM_WRITE                                         NUMBER
CNUM_SET                                           NUMBER
BUF_GOT                                            NUMBER
SUM_WRITE                                          NUMBER
SUM_SCAN                                           NUMBER
FREE_BUFFER_WAIT                                   NUMBER
WRITE_COMPLETE_WAIT                                NUMBER
BUFFER_BUSY_WAIT                                   NUMBER
FREE_BUFFER_INSPECTED                              NUMBER
DIRTY_BUFFERS_INSPECTED                            NUMBER
DB_BLOCK_CHANGE                                    NUMBER
DB_BLOCK_GETS                                      NUMBER
CONSISTENT_GETS                                    NUMBER
PHYSICAL_READS                                     NUMBER

写在后面

本来整体简单介绍其系统架构,不料在涉及其组成部分过于复杂,为避免蝙蝠过长,今天先写到这,在今后的时间我还会对更多的架构组成及其应用做讲解。