1. 程式人生 > >關係型資料庫Oracle之架構詳解

關係型資料庫Oracle之架構詳解

寫在前面

作為開發人員,掌握資料庫是必不可少的一件事情,當你已經對資料庫系統的基本理論知識和基本的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

寫在後面

本來整體簡單介紹其系統架構,不料在涉及其組成部分過於複雜,為避免蝙蝠過長,今天先寫到這,在今後的時間我還會對更多的架構組成及其應用做講解。