當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 塊的大?。?/p>
[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上。
原文轉自:http://www.cnblogs.com/fnng/archive/2012/09/17/2689716.html