Oracle的儲存結構關係

來源:互聯網
上載者:User

 

oracle資料庫的整體結構                                                          

 

資料庫的結構關係

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

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

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

Segments (段): 段是資料表空間的重要組織圖,段是指佔用資料檔案空間的通稱,或資料庫物件使用的空間的集合;段可以有表段、索引段、復原段、臨時段和快取段等。 

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

Data Block (資料區塊):是oralce 管理資料檔案中儲存空間的單位,為資料庫使用的I/O的最小單位,其大小可不同於作業系統的標準I/O塊大小。

 

(Storage Clause Precedence)儲存規範優先

 

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

具體規定:

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

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

 

 

Types of segments (段的類型)                                                                        

 

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

Table 

  對於一個只有幾百條幾千條資料,一個學校的學產生績表,那麼一張表就是一個segments 。

Table partition : 

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

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

Cluster 

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

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

Index 

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

 

Index-organized table :

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

  IOT帶來的好處不僅節約磁碟空間的佔用,更重要的是大幅度降低了I/O,減少了訪問緩衝區快取(儘管從緩衝區快取擷取資料比硬碟要快得多,但緩衝區快取並不是免費,而且也絕不是廉價的。第個緩衝區快取擷取都需要緩衝區快取的多個閂,而閂是序列化裝置,會限制應用的擴充能力)

Index partition 

      對於table有partition ,那麼對一個大的index有也partition 。

  分區所引可以分為全域分區索引與本地分區索引,其中本地索引又可以分為本地首碼索引和本地非首碼索引。

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

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

Undo segment 

復原段用於存放資料修改之前的值(包括資料修改之前的位置和值)。復原段的頭部包含正在使用的該復原段事務的資訊。一個事務只能使用一個復原段來存放它的復原資訊,而一個復原段可以存放多個事務的復原資訊。

Temporary segment   

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

LOB segment 

Large  object (LOB) 大大的對象,我們知道資料庫不但可以存資料,有些可以儲存視頻聲音圖片等檔案,對於這種類型的檔案一個大小几MB,幾十MB很正常。當然,有些資料庫是不支援LOB資料區塊的,可以在表裡存一個指標,來指向某個檔案下的視頻音效檔。

Nested table 

巢狀表格,表中表,和LOB思想很類似,就是在表裡存一個指標,指標指向另外一張表。

Bootstrap segment 

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

 

 

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

 

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

 

一個資料檔案有一個檔案頭,點用了若干個資料區塊,這這個檔案頭裡記錄著盤區的分配與釋放的資訊。在這個檔案中有些盤區是被使用的,有些盤區是閒置。

什麼時候建立盤區

建立

擴充

改變(改大)

什麼時候釋放盤區

刪除

改變(改小)

 

 

Database Block(資料庫塊)                                    

 

最小單位的輸入/輸出

資料區塊由作業系統中的一個或多個塊組成

資料區塊是資料表空間的基本單位

DB_BLOCK_SIZE 檔案來表示預設塊的大小

 

查看oracle 塊的大小:

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

 

 

  在早期的資料庫中,oracle只支援一種資料區塊的大小。從9i版本支援了改變大小的設定。但也不是任使用者隨便改動的,規定範圍在2KB到32KB之間,必須是倍數增加的,也就是2KB\4KB\8KB\16KB\32KB 五種大小。

  需要注意的是,塊大小的設定是在資料庫建立時候設定的,一旦設定好是不可更改的。類似於我們磁碟的儲存格式,FAT16、FAT32、NTFS.... ,要想改變儲存格式只能數資料全部格式化掉。

 

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

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

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

 

Orcale 是如何管理資料的儲存的                                    

 

High-Water Mark

對一一個建立立的表,表中包含很多資料區塊,water mark 原始指向表中的第一個資料區塊。

water mark隨著插入的資料“向前”移動。當把插入的資料刪除掉一些,water mark 並不會“向後”移動。也就是water mark 的位置表示曆史的最高水位。

 

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

 

  首先會先尋找灰色的,灰色部分表示就已經插入資料的塊,但這些塊並不是已經被完全佔滿了,有些或多或少的都會留下一些空間,關於留空間的規則,後面細說。如果插入一個很小的資料,灰色被占的資料區塊中可以完全插入的,就會被插在這一部分。

  如果資料比較大,尋找了所有被佔用塊都無法插入,那麼將會選擇“曾經”插入過資料的空白塊進行插入,也就是淺灰色部分。

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

 

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

 

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

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

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.