Oracle区概念总结
數(shù)據(jù)區(qū)概述
數(shù)據(jù)擴展(extent)是由一組連續(xù)的數(shù)據(jù)塊(data block)構成的數(shù)據(jù)庫邏輯存儲分配單位。而段(segment)則是由一個或多個數(shù)據(jù)擴展構成。當一個段中已有空間已經(jīng)用完,Oracle為這個段分配新的數(shù)據(jù)擴展。
數(shù)據(jù)區(qū)何時被分配
當用戶創(chuàng)建數(shù)據(jù)表時,Oracle為此表的數(shù)據(jù)段分配一個包含若干數(shù)據(jù)塊的初始數(shù)據(jù)擴展(initial extent)。雖然此時數(shù)據(jù)表中還沒有數(shù)據(jù),但是在此初始數(shù)據(jù)擴展中的數(shù)據(jù)塊已經(jīng)為插入新數(shù)據(jù)做好了準備。
如果一個段(segment)的?初始區(qū)中的數(shù)據(jù)塊(data block)都已裝滿,且有新數(shù)據(jù)插入需要空間時,Oracle自動為這個段分配一個增量數(shù)據(jù)擴展(incremental extent)。增量數(shù)據(jù)擴展?是一個段中繼已有數(shù)據(jù)擴展之后分配的后續(xù)數(shù)據(jù)擴展,她的容量大于或等于之前的數(shù)據(jù)擴展?。
為了管理的需要,每個段的段頭(header block)中包含一個記錄此段所有數(shù)據(jù)擴展(extent)的目錄。(對于這里的數(shù)據(jù)擴展目錄,個人理解為,在本地管理表空間中段所使用的位圖來管理數(shù)據(jù)區(qū)的分配,待驗證?)
如何決定分配數(shù)據(jù)擴展的容量與數(shù)量
每個段(segment)的定義中都包含了數(shù)據(jù)擴展(extent)的存儲參數(shù)?(storage parameter)。存儲參數(shù)適用于各種類型的段。這個參數(shù)控制著Oracle如何為段分配可用空間。例如,用戶可以在?CREATE TABLE 語句中使用?STORAGE 子句設定存儲參數(shù),決定創(chuàng)建表時為其數(shù)據(jù)段(data segment)分配多少初始空間,或限定一個表最多可以包含多少數(shù)據(jù)擴展。如果用戶沒有為表設定存儲參數(shù),那么表在創(chuàng)建時使用所在表空間(tablespace)的默認存儲參數(shù)。
用戶既可以使用?數(shù)據(jù)字典管理的表空間(dictionary managed tablespace)(依賴數(shù)據(jù)字典表監(jiān)控空間的利用情況),也可以使用本地管理的表空間(locally managed tablespace)(使用位圖(bitmap)來標記可用與已用空間)。由于本地管理的表空間性能較好且易于管理,當用戶沒有顯式地設定數(shù)據(jù)擴展(extent)管理參數(shù)時,除了10G以后?SYSTEM?之外的所有永久表空間(permanent tablespace)默認使用本地管理方式。
在一個本地管理的表空間中,其中所分配的數(shù)據(jù)擴展(extent)的容量既可以是用戶設定的固定值,也可以是由系統(tǒng)自動決定的可變值。當用戶創(chuàng)建表空間(tablespace)時可以使用UNIFORM?(用戶指定)或?AUTOALLOCATE?(?由系統(tǒng)管理)子句設定數(shù)據(jù)擴展的分配方式。
對于固定容量(UNIFORM?)的數(shù)據(jù)擴展,用戶可以為數(shù)據(jù)擴展設定容量或使用默認大小(1 MB)。?用戶須確保?其中最小的UNIFORM SIZE容量至少能包含5個數(shù)據(jù)塊?。本地管理的臨時表空間?在分配數(shù)據(jù)擴展時只能使用此種方式。
對于由系統(tǒng)管理(AUTOALLOCATE?)的數(shù)據(jù)擴展,由Oracle決定新增數(shù)據(jù)擴展的最佳容量,其最小容量為 64 KB?。如果創(chuàng)建表空間時使用了“segment space management auto”子句,且數(shù)據(jù)塊容量大于等于 16 KB,Oracle擴展一個段時所創(chuàng)建的數(shù)據(jù)擴展的最小容量為 1 MB。對于永久表空間上述參數(shù)均為默認值。
在本地管理的表空間中,INITIAL?,NEXT?,PCTINCREASE?,和?MINEXTENTS?這四個存儲參數(shù)可以作用于段(segment),但不能作用于表空間。INITIAL?,NEXT?,PCTINCREASE?,和?MINEXTENTS?相結合可以用于計算段的初始容量。當段容量確定后,Oracle使用內(nèi)部算法確定其中每個初始數(shù)據(jù)擴展(extent)的容量。
區(qū)如何被分配
Oracle依據(jù)表空間管理方式的不同(本地管理(locally managed)或數(shù)據(jù)字典管理(dictionary managed)),選擇不同的算法分配數(shù)據(jù)擴展(extent)。
對于本地管理的表空間,Oracle在為新的數(shù)據(jù)擴展(extent)尋找可用空間時,首先選擇一個屬于此表空間的數(shù)據(jù)文件(datafile),再搜 索此數(shù)據(jù)文件的位圖(bitmap)查找連續(xù)的數(shù)據(jù)塊(free block)。如果此數(shù)據(jù)塊中沒有足夠的連續(xù)可用空間,Oracle將查詢其他數(shù)據(jù)文件。
數(shù)據(jù)區(qū)合適被回收
Oracle 數(shù)據(jù)庫提供了 Segment Advisor 工具,她依據(jù)方案對象(schema object)存儲空間中的碎片程度來判斷此對象中是否包含可回收的空間。
一般來說,在用戶將一個段(segment)對應的方案對象(schema object)移除(使用?DROP TABLE?或?DROP CLUSTER?語句)之前,此段的數(shù)據(jù)擴展(extent)不會被回收到表空間(tablespace)中,但是以下情況例外:
1、表,簇表的所有者(owner)或擁有?DELETE ANY?權限的用戶, 可以使用?TRUNCATE...DROP STORAGE?語句將表,簇表的數(shù)據(jù)清除
2、DBA 可以使用以下語法收回一個段中未使用的數(shù)據(jù)擴展:
ALTER TABLE table_name DEALLOCATE UNUSED;
3、如果用戶為回滾段(rollback segment)設定了?OPTIMAL?參數(shù),Oracle將周期性地從其中回收數(shù)據(jù)擴展。
當數(shù)據(jù)擴展(extent)被釋放后,Oracle修改數(shù)據(jù)文件中的位圖(對于本地管理的表空間)或更新數(shù)據(jù)字典(對于數(shù)據(jù)字典管理的表空間),將回收的數(shù)據(jù)擴展視為可用空間。被釋放的數(shù)據(jù)擴展中的數(shù)據(jù)無法繼續(xù)訪問。
非簇表中的數(shù)據(jù)擴展
只要用戶沒有移除(drop)或清空(truncate)非簇表,那么對應數(shù)據(jù)段內(nèi)的任何數(shù)據(jù)塊都不會被回收。Oracle會在插入數(shù)據(jù)時使用這些數(shù)據(jù)塊(只要數(shù)據(jù)塊有足夠的空間)。即使用戶刪除(delete)了表的所有行,Oracle也不會回收此表的數(shù)據(jù)塊供表空間內(nèi)的其他方案對象(schema object)使用。
當用戶移除(drop)了一個非簇表(nonclustered table),Oracle將在需要空間時回收此表對應的數(shù)據(jù)擴展?。Oracle將此表對應的數(shù)據(jù)段(data segment)、索引段(index segment)中包含的數(shù)據(jù)擴展(extent)全部收回,并供存儲于此表空間的其他方案對象(schema object)使用。
對于數(shù)據(jù)字典管理的表空間(dictionary managed tablespace),當一個段(segment)需要的數(shù)據(jù)擴展(extent)比現(xiàn)有可用擴展的都大時,Oracle通過尋找、合并連續(xù)的被回收的數(shù)據(jù)擴展來形成更大的數(shù)據(jù)擴展。這個過程被稱為數(shù)據(jù)擴展合并?(coalescing)。本地管理的表空間沒有必要進行數(shù)據(jù)擴展合并,因為所有連續(xù)空間都可以被用于分配新數(shù)據(jù)擴展,而無需關心所用空間是如何被回收的。
簇表中的數(shù)據(jù)擴展
Therefore, if you drop one table in a cluster, the data segment remains for the other tables in the cluster, and no extents are deallocated. You can also truncate clusters (except for hash clusters) to free extents.
簇表(clustered table)的數(shù)據(jù)存儲在為整個簇(cluster)分配的數(shù)據(jù)段(data segment)中。因此當用戶移除(drop)簇中的一個表時,數(shù)據(jù)段還要為簇中的其他表保留,因此沒有數(shù)據(jù)擴展(extent)被回收。用戶可以通過清空(truncate)整個簇來回收屬于簇的數(shù)據(jù)擴展(哈希簇(hash cluster)除外)。
物化視圖的數(shù)據(jù)擴展
Oracle回收屬于物化視圖(materialized view)及其日志(materialized view log)的數(shù)據(jù)擴展的方式與表或簇相同。
索引的數(shù)據(jù)擴展
只要索引存在,那么對應索引段(index segment)的所有數(shù)據(jù)擴展(extent)都不會被回收。當用戶移除(drop)索引或相關的表、簇表時,Oracle才將索引使用的數(shù)據(jù)擴展回收。
臨時段中的數(shù)據(jù)擴展
當Oracle執(zhí)行完一個 SQL 語句,且在執(zhí)行過程中使用的臨時段時,Oracle通過以下機制對臨時段的數(shù)據(jù)空間進行回收。
1、當用戶執(zhí)行單一排序語句時,Oracle將在此用戶的臨時表空間中創(chuàng)建為這個排序服務的臨時段,并在執(zhí)行后將此臨時段使用的數(shù)據(jù)擴展回收。
2、?當用戶執(zhí)行?多重排序?語句?時?,可能會使用臨時表空間中專為排序而創(chuàng)建的排序段。在每個實例中只會分配一個排序段,在排序操作使用后也不會被回收,而是繼續(xù)供以后的多重排序使用。?
同一會話或同一事務的多個 SQL 語句,有可能共同使用一個臨時表的臨時段存儲臨時數(shù)據(jù)。在這種情況下,Oracle在會話或事務結束后才移除臨時段,并為臨時段所在表空間回收使用的數(shù)據(jù)擴展。
回滾段的數(shù)據(jù)擴展
如果用戶為回滾段(rollback segment)設定了?OPTIMAL?參數(shù),?Oracle周期性地檢查數(shù)據(jù)庫回滾段的容量是否超過了最優(yōu)值。如果回滾段超過了這個最優(yōu)值(即回滾段中的數(shù)據(jù)擴展過多),Oracle將自動地從回滾段回收一些數(shù)據(jù)擴展。
總結
以上是生活随笔為你收集整理的Oracle区概念总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何使用logminer查看日志内容
- 下一篇: RAC 核心概念 Cache Fusi