Oracle 的邏輯結構 ( 表空間、段、區間、塊 ) ——段
資料段是一系列區間 , 在這個特定邏輯存儲結構存儲的資料都在一個表空間内 . 例如對于每一種資料庫 對象 ( 表、索引 ) ,資料庫都會配置設定一個或一段區間構成其對象的資料段。
A segment is a set of extents that contains all the data for a specific logical storage structure within a tablespace. For example, for each table, Oracle allocates one or more extents to form. that table’s data segment, and for each index, Oracle allocates one or more extents to form. its index segment
資料段
Oracle 資料庫中,一個獨立的資料段儲存以下所有情況的資料:
l 一個非分區表或非簇的表
l 分區表的一個分區
l 表的一個簇
當使用 Create 語句建立表或簇的時候, Oracle 會自動建立該資料段。
表或簇的存儲參數決定了該資料段的區間如何配置設定。存儲參數也影響了與該對象相關的資料段的存儲和資料的查詢。
索引段
Oracle 資料庫中每一個非分區索引都有一個對應的單一的索引段用來儲存所有資料。對于分區索引而言,每一個分區都有一個單一的索引短。
當執行Create Index 語句,Oracle 就會建立相應的索引段。在建立索引的時候同樣也可以指定相應的存儲參數。設定這些參數将會直接影響到資料查詢和存儲的效率。
臨時段
處理查詢的時候,對于 SQL 語句的解析和執行階段 Oracle 經常需要臨時工作區。 Oracle 字段配置設定的磁盤空間就叫臨時段。例如, Oracle 需要一個臨時段作為排序工作區。如果排序操作可以在記憶體進行或者 Oracle 可以直接使用索引的話, Oracle 就不會建立這個臨時段。
以下語句有時會需要使用臨時段:
l CREATE INDEX
l SELECT ... ORDER BY
l SELECT DISTINCT ...
l SELECT ... GROUP BY
l SELECT ... UNION
l SELECT ... INTERSECT
l SELECT ... MINUS
自動復原( 撤銷) 段
自動復原 ( 撤銷 ) 段管理 是基于 undo 表空間的,取代了原來的人工配置設定復原段的方式。
自動撤銷段管理允許你顯式的控制 undo retention(undo 保留時間 ) ,通過 UNDO_RETENTION 系統參數,可以指定在資料庫中已送出的 undo 資訊所保留的量。通過控制 retention ,你可以配置你的系統以確定長期運作的查詢能夠運作成功。
Oracle 用 V$UNDOSTAT 視圖來監控和配置你的資料庫系統以確定 undo 空間高效使用。
UNDO Retention 控制
長時間運作的查詢有時會失敗,因為對于所需的一緻性讀操作的 undo 資訊已不再可用。這通常發生在已送出的 undo 資料塊被活動事務給覆寫了。
自動撤消管理為 undo 空間何時重用提供了一種顯式的控制方法,也就是 undo 資訊能夠保留多久。 DBA 可以用 UNDO_RENTENTION 參數指定保留時間。例如,如果 UNDO_RETENTION 設定為 30 分鐘,那麼系統中所有已送出的 undo 資訊将至少保留 30 分鐘。這樣就可以確定所有運作小于等于 30 分鐘的查詢,在通常情況下,不會碰到 ”snapshot too old” 的 Oracle 錯誤。
你可以在資料庫啟動時設定 UNDO_RETENTION 或者通過 ALTER SYSTEM 語句改變改變設定。下面的例子為設定 retention 為 20 分鐘:
ALTER SYSTEM SET UNDO_RETENTION = 1200 ;
如果沒有設定 UNDO_RETENTION 參數的話, Oracle 會使用一個基于多數 OLTP 系統預置的預設值,通常情況下查詢時間不會很長。
Oracle 提供如下為新資料庫設定撤銷保留時間間隔的指導:
1 、 OLTP 系統: 15 分鐘
2 、 混合: 1 小時
3 、 DSS 系統: 3 小時
4 、 閃回查詢: 24 小時
表與段的關系
如何查找一個表所對應的所有段
包含 4 個部分
-- 普通表段 , 對于分區表每個區對應一個分區段
--BLOB 段 , 普通表每個 BLOB 字段一個段;分區表每個分區一個 BLOB 段
--BLOB 索引段,同上
-- 普通索引段,全局索引每個索引一個段;分區索引每個索引則一個段
測試 :建立一個帶 BLOB 字段的分區表
create table TESTPARTITION
(
A VARCHAR2(10),
B VARCHAR2(10),
C BLOB
)
partition by list (A)
partition PARTA values ('A'),
partition PARTB values ('B')
);
建立一個全局索引和局部索引
CREATE INDEX INDTESTPARTITIONGLOBAL_B ON TESTPARTITION(b);
CREATE INDEX INDTESTPARTITIONLOCAL_A ON TESTPARTITION(A) local
partition part_A tablespace AUTOALLOCATE,
partition part_B tablespace AUTOALLOCATE
查詢該表所有的段
SELECT A.SEGMENT_NAME TABLE_NAME,'N/A' COLUMN_NAME,A.SEGMENT_NAME,'TABLE' SEGMENT_TYPE,A.HEADER_FILE,A.HEADER_BLOCK,A.BYTES
FROM DBA_SEGMENTS A --LOCAL SEGMENT
WHERE A.segment_name='TBLTESTSEGMENT'
UNION ALL
select A.TABLE_NAME,A.COLUMN_NAME,B.SEGMENT_NAME,B.SEGMENT_TYPE,B.HEADER_FILE,B.HEADER_BLOCK,B.BYTES
from DBA_LOBS A,DBA_SEGMENTS B --LOB SEGMENT
where A.SEGMENT_NAME=B.SEGMENT_NAME AND A.TABLE_NAME='TBLTESTSEGMENT'
from DBA_LOBS A,DBA_SEGMENTS B --LOB INDEX SEGMENT
where A.INDEX_NAME=B.SEGMENT_NAME AND A.TABLE_NAME='TBLTESTSEGMENT'
select A.TABLE_NAME,A.INDEX_NAME,B.PARTITION_NAME,B.SEGMENT_NAME,B.SEGMENT_TYPE,B.HEADER_FILE,B.HEADER_BLOCK,B.BYTES
from DBA_INDEXES A,DBA_SEGMENTS B --INDEX SEGMENT
where A.INDEX_NAME=B.SEGMENT_NAME AND A.TABLE_NAME='TESTPARTITION'
深度了解 Oracle10g 中 UNDO_RETENTION 參數的使用
<a href="http://blog.csdn.net/seagal890/archive/2008/10/09/3044226.aspx">http://blog.csdn.net/seagal890/archive/2008/10/09/3044226.aspx</a>
<a href="http://space.itpub.net/6517/7607759/viewspace-260278">http://space.itpub.net/7607759/viewspace-260278</a>
本文轉自baoqiangwang51CTO部落格,原文連結:http://blog.51cto.com/baoqiangwang/312711,如需轉載請自行聯系原作者