段(segment)是一種在數據庫中消耗物理存儲空間的任何實體(一個段可能存在于多個數據文件中,因為物理的數據文件
是組成邏輯表空間的基本物理存儲單位)
今天碰到一個高水位問題:
一個分區表,刪除某個分區中的一些數據后,表空間并沒有回收。
原因:
如果一個表不進行分區,那么一個表就是在一個segment中。如果一個表進行多個分區,那么每一個分區就在一個segment。如果delete掉其中一些數據,那么空間是不會回收的
除非trunc掉這個分區。
解決辦法:
用導出導入分區交換的辦法,回收數據庫表空間。
--創建臨時表導出某天數據
createtabletemp_msgbodyasselect*fromim_msginfo_bodypartition(P_MSGINFO_BODY_20141213)
--清空導出的分區
altertableim_msginfo_bodytruncatepartitionP_MSGINFO_BODY_20141213
--分區交換,將數據倒回
ALTERTABLEim_msginfo_bodyEXCHANGEPARTITIONP_MSGINFO_BODY_20141213WITHTABLEtemp_msgbodywithvalidation;
附segment(段)概念:
段(segment)是一種在數據庫中消耗物理存儲空間的任何實體(一個段可能存在于多個數據文件中,因為物理的數據文件
是組成邏輯表空間的基本物理存儲單位)
更多的通用段是
表(table),用來保存行列結構的數據
索引(Index),用來加快訪問速遞
回滾(Rollback),在用戶事務期間和執行事務恢復期間用來維護讀一致性的特殊的段,回滾段會被宰第8章節管理一致和
并發繼續說明
分區(partition),為實現性能目標把表分成更小的更加容易管理的片。
EXTENTS 是有由存儲空間連續的塊組成,但是每一個擴展只能駐留在單個數據文件中
Database blocks 是orcacle中更小的塊,他操作系統塊組成。
OS塊
段是由擴展組成的,一到二億個擴展,由于每個擴展只能屬于單個數據文件,所以段可以分布在不同的數據文件中,
擴展是由數據庫塊組成的,
每個擴展,數據庫塊是有操作系統塊組成。
表空間是為方便管理物理的分組模式對象(schema objects),表空間是物理結構(數據文件和和擴展)和邏輯結構(表和索引)的橋梁,
訪問段可以用sql語言,C語言,cobol,Java等語言。
一張只能占用一個段的空間,當這個表的數據增加,段可以為表重新分配新的區,這樣空間就可以擴展了;
還有,一個段只屬于一個表空間,一個表空間可以有多個段;表空間和段是邏輯存儲結構上的一對多的關系;
表空間和數據文件也是一對多的關系,段和數據文件不是沒有直接關系;
但一個段可以屬于多個數據文件;
所以當段空間不足時,也就是相當于表空間不足;只要你擴展表空間大小或新增數據文件就可以了;