Oracle的資料存盤結構

- 表空間(tablespace)--Oracle中最大的邏輯存盤單位
- 資料檔案(data file)--表空間物理存盤載體
- 段(segment)--Oracle中所有占用空間的物件的總稱
- extend--段的組成單位
- 資料塊(data block)--extend的組成單位,是Oracle存盤和資料操作的最小單位,
資料塊
資料塊是Oracle存盤和資料操作的最小單位,但不一定和作業系統的os塊相同,一個資料塊可能有多個os塊構成,

資料塊的存盤屬性
PCTFREE (percent free)
為一個塊保留的空間百分比,表示資料塊在什么情況下可以被insert,默認是10,表示當資料塊的可用空間低于10%后,就不可以被insert了,只能被用于update;即:當使用一個block時,在達到pctfree之前,該block是一直可以被插入的,這個時候處在上升期,
PCTUSED (percent used)
當資料塊的剩余空間達到PCTFREE之后就不可以insert了,但是進行的delete操作和update操作會釋放資料塊的空間,如果資料塊的空間釋放到了PCTUSED之后就可以開始insert資料了,
行鏈接和行遷移
行遷移——update操作引起的
當一條記錄被更新時,資料庫引擎首先會嘗試在它保存的資料塊中尋找足夠的空閑空間,如果沒有足夠的空閑空間可用,這條記錄將被拆分為兩個部分,第一個部分包括指向第二個部分的rowid,該部分任然保留在原來的資料塊中,第二個部分包含所有的具體資料,將保存到另外一個新的資料塊中,這個就成為行遷移,

為什么不將整行都放到新的資料塊中?
原因是這樣會導致該行資料rowid發生變化,而rowid被存盤在索引中,也有可能被客戶端臨時保存在記憶體中,rowid的變化可能導致查詢錯誤,該行不僅存了本行id還有新行的id,相當于存入了指標,并且保留了頭指標,
行鏈接——insert操作或者update操作引起的
行鏈接和行遷移不同,行鏈接是當一條記錄太大,在一個資料塊中無法存入,這時會被拆分為2個或以上的部分,存盤在多個塊中,這多個塊之間會構造一個鏈

行鏈接的原因則可能為:
-
直接插入大的記錄;
-
更新記錄導致記錄大于一個資料塊,在這時,這樣記錄可能會同時變為行遷移和行鏈接,
行遷移和行鏈接的參考資料:
http://www.2cto.com/database/201410/344139.html
資料塊空閑空間
-
可以手工對資料塊進行空閑空間合并,資料會被再次使用
- 當一個插入或者更新操作哦的行在一個資料塊中有足夠的空閑空間
- 并且這個空閑空間是碎片狀態,無法滿足一行資料的使用
-
oracle不總是自動整碎片的原因是,這會導致一定的系統資源開銷
索引資料塊的整理
Alter index coalesce——合并同一個branch的資料塊(coalesce,合并,聚合)
Alter index REBUILD——重構整個索引段
SQL> create table t1(id int,score int);
表已創建,
SQL> create index idx_st on t1(id);
索引已創建,
SQL> alter index idx_st coalesce;
索引已更改,
SQL> alter index idx_st rebuild;
索引已更改,
Oracle的讀操作
①邏輯讀:從記憶體中讀取資料塊
②物理讀:從磁盤讀取資料塊到記憶體
單塊讀:每次從磁盤讀取一個資料塊
多塊讀:每次從磁盤讀取多個資料塊
Extent-區間
是由一組連續的資料塊組成,多個extent構成一個段(segment),
Oracle11g中創建表之后并不會立刻就分配extent,只有在插入一個資料之后才會分配extent,
關于extent的具體實驗效果可以參見如下資料:
http://blog.itpub.net/12798004/viewspace-1250248/
Segment-段
什么是段?
在Oracle表中,凡是分配了空間的物件,都稱之為段,
- 表,表磁區
- 索引,索引磁區
- 大物件(LOB,large object)
段的分類
- 資料段
- 臨時段
- 回滾段
臨時段
也成為臨時表空間,存在臨時表空間中的資料成為臨時段,
- 排序,hash,merge...(需要一個中間資料處理區域)
- 只有在記憶體空不足時,Oracle才會在臨時表空間上創建臨時段,
- 臨時段上的操作并不記錄redo log
臨時表
臨時表的概念
臨時表就是用來暫時保存臨時資料(亦或叫中間資料)的一個資料庫物件,
- Oracle的臨時表只存在于某個會話或者事務的生命周期里,此時臨時表中的資料只對這個會話可見,
- 臨時表經常被用于存放一個操作的中間資料(資料處理的中間環節)
- 臨時表由于不產生redo,能夠提高資料操作的性能,
臨時表的分類
根據on commit的設定,可以將臨時表分為兩類,會話級的臨時表和事務級的臨時表,
- on commit delete rows
臨時表的默認引數,表示臨時表中的資料僅在事務(transaction)程序中有效,當事務提交(commit),臨時表的臨時段將被自動截斷(truncate),但是臨時表的結構以及元資料還存在用戶的資料字典中,如果臨時表完成使命之后,最好洗掉臨時表,否則資料庫會殘留很多臨時表的表結構和元資料,
- on commit preserve rows
它表示臨時表的內容可以跨事物而存在,不過,當該會話結束時,臨時表的暫時段將隨著會話的結束而被丟棄,臨時表中的資料自然也就隨之丟棄,但是臨時表的結構以及元資料還存盤在用戶的資料字典中,如果臨時表完成它的使命后,最好洗掉臨時表,否則資料庫會殘留很多臨時表的表結構和元資料,
臨時表-on commit delete rows
SQL> create global temporary table t_temp on commit delete rows as select * from
dba_objects;
表已創建,
SQL> select count(*) from t_temp;
COUNT(*)
----------
0
SQL> insert into t_temp select * from dba_objects;
已創建72635行,
SQL> select count(*) from t_temp;
COUNT(*)
----------
72635
SQL> commit;
提交完成,
SQL> select count(*) from t_temp;
COUNT(*)
----------
0
解釋:
創建臨時表空的create陳述句屬于DDL陳述句,雖然創建的時候有初始資料,但是創建之后就相當于進行了一次commit,所以t_temp中并沒有資料,insert插入資料之后t_temp表中就有了72635條資料,經過commit操作,資料就直接truncate掉了,但是表還存在著,
臨時表-on commit preserve rows
SQL> create global temporary table t_temp on commit preserve rows as select * from dba_objects;
表已創建,
SQL> select count(*) from t_temp;
COUNT(*)
----------
72675
SQL> insert into t_temp select * from dba_objects;
已創建72675行,
SQL> select count(*) from t_temp;
COUNT(*)
----------
145350
SQL> quit;
從 Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options 斷
開
C:\Users\clg>sqlplus / as sysdba
SQL*Plus: Release 11.2.0.1.0 Production on 星期三 3月 16 20:34:08 2016
Copyright (c) 1982, 2010, Oracle. All rights reserved.
連接到:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> select count(*) from t_temp;
COUNT(*)
----------
0
SQL> drop table t_temp;
表已洗掉,
關于臨時表的使用可以參見:
https://www.cnblogs.com/kerrycode/p/3285936.html
臨時表-索引
臨時表也是可以創建索引的,基本使用和表-索引差不多,
段的壓縮
Oracle允許對段進行壓縮,oracle的資料段壓縮技術可以理解為"塊級壓縮"技術,也就是說是針對block級別的資料壓縮,它是在block中引入記號表(symbol表),block中的重復資料在symbol中用一個項(指標)表示,即塊中相同的row只存盤一條,從而節約了空間,
優點:
- 減少存盤空間
- 減少處理的資料塊
- 減少記憶體占用
- 提高I/O效率
- 提高查詢效率
缺點:
- 因為要額外對資料做處理,在資料插入時,會消耗更多的資源和時間,
創建壓縮表
create table t_comp compress;
或者是:下創建表,后激活壓縮
SQL> create table t1(id int);
表已創建,
SQL> alter table t1 compress;
表已更改,
段壓縮的級別
-
表空間級
-
表級
-
磁區
-
子磁區
段的存盤管理
MSSM--Manual Segment Space Management
- 手工設定物件的存盤引數:PCTFREE,PCTUSED......
ASSM--Automatic Segment Space Management
- Oracle自動設定物件的存盤引數:只可以手工設定PCTFREE引數,其他引數由Oracle自動設定,
Tablespace-表空間
大檔案表空間:bigfile欄位
普通的資料檔案,收到資料塊的限制
- 每個資料檔案最多只能包含2^22-1(4M)個資料塊
- 2k--8G
- 4k--16G
- 8k--32G
- ...
大資料檔案,可以使用2^32(4G)個資料塊
- 2k--8T
- 4k--16
- ...T
大資料表空間的優勢:
- 減少資料庫的資料個數限制(每個資料庫64k個資料檔案)
- 方便檔案的管理,不需要人工干預表空間的檔案大小,
- 減少資料庫對檔案頭同步的開銷,
表空間的管理方式
字典管理表空間(Dictionary-managed tablespaces)
所有表空間存盤在資料字典中,統一調配,現在基本不用
本地管理表空間(locally managed tablespace)
本地管理表空間不是在資料詞典里存盤表空間的,由自由區管理的表空間,用位圖來自由的管理區間,一個區間對一個位,如果這個位是1表示已經被占用,0表示未被占用,
詞典管理空間表示“中央集權治”,本地管理表空間表示“省市自治區”,一個databases表示中國,tablespaces表示一個省或直轄市,詞典管理統一由中央調配,而本地管理表示有高度的自治權利,自已各種資源的分配不用上報中央,
表空間的存盤屬性
每一個級別的都有自己的管理方式,
資料管理方式
- local
- dictionary
段管理
- ASSM
- MSSM
extent管理
- AutoAllocate(自動分配)
- Uniform(統一大小分配)
記得幫我點贊哦!
精心整理了計算機各個方向的從入門、進階、實戰的視頻課程和電子書,按照目錄合理分類,總能找到你需要的學習資料,還在等什么?快去關注下載吧!!!

念念不忘,必有回響,小伙伴們幫我點個贊吧,非常感謝,
我是職場亮哥,YY高級軟體工程師、四年作業經驗,拒絕咸魚爭當龍頭的斜杠程式員,
聽我說,進步多,程式人生一把梭
如果有幸能幫到你,請幫我點個【贊】,給個關注,如果能順帶評論給個鼓勵,將不勝感激,
職場亮哥文章串列:更多文章

本人所有文章、回答都與著作權保護平臺有合作,著作權歸職場亮哥所有,未經授權,轉載必究!
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/1148.html
標籤:Oracle
上一篇:Oracle資料字典
下一篇:Oracle RAC與DG
