oracle數據庫的整體結構

jopen 12年前發布 | 48K 次閱讀 Oracle 數據庫服務器

oracle數據庫的整體結構                                                         
</strong></span>

數據庫的結構關系

oracle數據庫的整體結構

        其實,我前面一篇講表空間的時候就介紹了數據庫的結構,只是那個圖只是簡單的層次關系,這張圖片看上去挺封復雜的,只要關注幾個概念就行了。

Database(數據庫) :數據庫是按照數據結構來組織、存儲和管理數據的倉庫。

Tablespaces(表空間) :表空間是數據庫的邏輯劃分,一個表空間只能屬于一個數據庫。所有的數據庫對象都存放在指定的表空間中。但主要存放的對象是表, 所以稱作表空間。

Segments (段): 段是表空間的重要組織結構,段是指占用數據文件空間的通稱,或數據庫對象使用的空間的集合;段可以有表段、索引段、回滾段、臨時段和高速緩存段等。 

extents (盤區):是數據庫存儲空間分配的一個邏輯單位,它由連續數據塊所組成。第一個段是由一個或多個盤區組成。當一段中間所有空間已完全使用,oracle為該段分配一個新的范圍。

Data Block (數據塊)oralce 管理數據文件中存儲空間的單位,為數據庫使用的I/O的最小單位,其大小可不同于操作系統的標準I/O塊大小。

 

Storage Clause Precedence)存儲規范優先

 

oracle數據庫的整體結構

        Oracle 在存儲控制上可以分為三個方式。oracle缺省級別、表空間級別、段級別,可以理解中央、省級、縣級。從中央到地方的法規條例。比如為了發展經濟,對于招商引資的規范。中央規定可以實行招商引資,某省比較窮,為了吸引投資商,規定降低企業所得稅。某縣為了吸引資源,可以規定對于投資商土地免費使用5年,不征收土地使用稅。那么某投資商來本縣后首先適用縣級規定。

具體規定:

1、不管你在哪個層面上修改存儲方式,修改的參數是對未來要分配的存儲extents (盤區)起作用。

2、一些參數只能在指定的級別上進行修改。有些參數只能表空間級別設置,有些參數只能在段級別設置。

 

 

Types of segments (段的類型)                                                                        

 

        因為關于表空間的一些基本知識我在另一節里做過專門介紹,這里我們認識一下段都有哪些常見類型。

oracle數據庫的整體結構

Table 

        對于一個只有幾百條幾千條數據,一個學校的學生成績表,那么一張表就是一個segments 

Table partition : 

        如果一張表非常大,里面存儲了幾千萬條、上億條記錄,那么對這一張表進行操作,效率就非常低了。分區表是將大表的數據分成稱為分區的許多小的子集。假如一張表是存放中國13億人口信息的表,那么這么多條記錄是有規律的,可以基于某一個字段將其分開。那么可以根據省級行政區可以劃分34個分區,每個分區實際上就是一個獨立的表,但在邏輯上這些分區又同屬于一張表。

如果一張表是普通的表,只點一個segments;如果一張表是partition的表,可能占多個segments

Cluster 

        Oracle中普通的表稱為堆表(heap table),堆表中的數據是無序存放的,往往在使用一段時間后,數據就變得非常無序。如下圖所示,索引中相同的key對應的數據存放在不同的block中,這時,如果要通過索引查詢某個key的數據,就需要訪問很多不同的block,代價非常高。 

我們發現很多表與表,他們的數據有相關性,因為我們訪問一個表里的數據,往往要訪問另一些表里的數據。我們可以把這些數據物理上存儲在一塊。

Index 

索引是與表和聚集相關的一種選擇結構,就當于我們一本書的目錄,可以快快速的定位某章某節的頁數。索引可以建立在一個表的一列或多列上,那就可以大大提高對表的查詢。那么一個index也可能會占一個多個segments 

 

oracle數據庫的整體結構

Index-organized table :

        索引組織表(IOT),就是存儲在一個索引結果中的表。存儲在堆中的表是無組織的(也就是說,只要有可用的空間,數據可放在任何地方),IOT中 暗則按主鍵存儲和排序。對你的應用來說,IOT表和一個“常規”表并無差別。使用堆組織表時,我們必須為表和表主鍵上的索引分別留出空間。而IOT不存在主鍵的空間開銷,因為所引就是數據,數據就是所引。

        IOT帶來的好處不僅節約磁盤空間的占用,更重要的是大幅度降低了I/O,減少了訪問緩沖區緩存(盡管從緩沖區緩存獲取數據比硬盤要快得多,但緩沖區緩存并不是免費,而且也絕不是廉價的。第個緩沖區緩存獲取都需要緩沖區緩存的多個閂,而閂是串行化設備,會限制應用的擴展能力)

Index partition 

      對于tablepartition ,那么對一個大的index有也partition 

        分區所引可以分為全局分區索引與本地分區索引,其中本地索引又可以分為本地前綴索引和本地非前綴索引。

本地索引的分區和其對應的表分區數量相等,因此每個表分區都對應著相應的索引分區。使用本地索引,不需要指定分區范圍因為索引對于表而言是本地的,當本地索引創建時,Oracle會自動為表中的每個分區創建獨立的索引分區。 

全局索引以整個表的數據為對象建立索引,索引分區中的索引條目既可能是基于相同的鍵值但是來自不同的分區,也可能是多個不同鍵值的組合。 全局索引既允許索引分區的鍵值和表分區鍵值相同,也可以不相同。全局索引和表之間沒有直接的聯系,這一點和本地索引不同。

Undo segment 

回滾段用于存放數據修改之前的值(包括數據修改之前的位置和值)。回滾段的頭部包含正在使用的該回滾段事務的信息。一個事務只能使用一個回滾段來存放它的回滾信息,而一個回滾段可以存放多個事務的回滾信息。

Temporary segment   

當Oracle處理一個查詢時,經常需要為SQL語 句的解析與執行的中間結果(intermediate stage)準備臨時空間。Oracle會自動地分配被稱為臨時段 (temporary segment)的磁盤空間。例如,Oracle在進行排序操作時就需要使用臨時段。當排序操作可以在內存中執行,或Oracle 設法利用索引就執行時,就不必創建臨時段。

oracle數據庫的整體結構

LOB segment 

Large  object LOB) 大大的對象,我們知道數據庫不但可以存數據,有些可以存儲視頻聲音圖片等文件,對于這種類型的文件一個大小幾MB,幾十MB很正常。當然,有些數據庫是不支持LOB數據塊的,可以在表里存一個指針,來指向某個文件下的視頻聲音文件。

Nested table 

嵌套表,表中表,和LOB思想很類似,就是在表里存一個指針,指針指向另外一張表。

Bootstrap segment 

關于引導段,暫時沒找到相關解釋。^_^

 

 

Extent alloc & dealloc(盤區分配與釋放)                         

 

        盤區是段下面的一個存儲單位,一個盤區在物理上是一段連續的數據塊。

 

oracle數據庫的整體結構

一個數據文件有一個文件頭,點用了若干個數據塊,這這個文件頭里記錄著盤區的分配與釋放的信息。在這個文件中有些盤區是被使用的,有些盤區是空閑的。

什么時候創建盤區

創建

擴展

改變(改大)

什么時候釋放盤區

刪除

改變(改小)

 

 

Database Block(數據庫塊)                                    

 

最小單位的輸入/輸出

數據塊由操作系統中的一個或多個塊組成

數據塊是表空間的基本單位

DB_BLOCK_SIZE 文件來表示缺省塊的大小

 

查看oracle 塊的大小:

[ora10@localhost dbs]$ strings spfileora10.ora | grep -i db_block*.db_block_size=8192  (8KB)

 

 

        在早期的數據庫中,oracle只支持一種數據塊的大小。從9i版本支持了改變大小的設置。但也不是任用戶隨便改動的,規定范圍在2KB32KB之間,必須是倍數增加的,也就是2KB\4KB\8KB\16KB\32KB 五種大小。

        需要注意的是,塊大小的設置是在數據庫創建時候設置的,一旦設置好是不可更改的。類似于我們磁盤的存儲格式,FAT16FAT32NTFS.... ,要想改變存儲格式只能數數據全部格式化掉。

oracle數據庫的整體結構

 

Hearder : 塊頭記錄一些控制信息,幫助oracle定位這個塊,塊與塊之間的串聯信息。

Free space :處于重現狀態的這空間。

Data :已經寫入數據的空間。數據存放數據的方式是自底往上的,就像現實中的一個箱子。

 

Orcale 是如何管理數據的存儲的                                    

 

High-Water Mark

oracle數據庫的整體結構

對一一個新建立的表,表中包含很多數據塊,water mark 原始指向表中的第一個數據塊。

water mark隨著插入的數據“向前”移動。當把插入的數據刪除掉一些,water mark 并不會“向后”移動。也就是water mark 的位置表示歷史的最高水位。

 

那么我們要想插入一些數據時,oralce是按什么樣的規則輸選擇插入位置呢?

 

oracle數據庫的整體結構

        首先會先查找灰色的,灰色部分表示就已經插入數據的塊,但這些塊并不是已經被完全占滿了,有些或多或少的都會留下一些空間,關于留空間的規則,后面細說。如果插入一個很小的數據,灰色被占的數據塊中可以完全插入的,就會被插在這一部分。

        如果數據比較大,查找了所有被占用塊都無法插入,那么將會選擇“曾經”插入過數據的空白塊進行插入,也就是上圖淺灰色部分。

        如果數據非常大,曾經插入數據的空白塊都無法插入,那么只好動用從未被插入過數據的空白塊進行插入。當然water mark 也就會“向前”移動。

 

OK下面就來具體分析,每個數據塊,是否允許插入數據的規則。

 

oracle數據庫的整體結構

         塊頭(數據塊的頭)不在百分比的范圍內,當剩余空間大于20%的時候,那這個塊就是納入freelist中,當我要插入一條數據時,freelist是會掃描這個塊的,檢查其它是否可以存放要插入的數據。當小于20%的這間時,說明這個塊已經滿了,會從freelist中去掉,插入數據時不作為掃描的對象。

        一個小于20%空閑的塊會從freelist上摘除,那么一個塊在什么情況下會被重新掛到freelist上呢?對于一個已經從freelist上摘除的塊,可以能由于刪除更新操作,其空間會得到釋放,當占用空間小于40%時,也就是空閑空間大于60%時,這個塊被有認為是空間的塊又會被重現掛到freelist上。

來自:http://www.cnblogs.com/fnng/archive/2012/09/17/2689716.html

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!