1.前言
這里說一下Oracle的數據結構(邏輯存儲架構)

2.Oracle的數據存儲結構
1)表空間(tablespace) -- oracle最大的邏輯存儲單位
2) 數據文件(data file) -- 表空間物理存儲載體(裸設備除外)
3)段(segment) -- oracle所有占用空間的對象的總稱
4)extent --段的組成單位
5)數據塊(data block) -- extent 的組成單位, 是oracle存儲和數據操作的最小單位
3.tablespace(表空間)
表空間類型:
1)permanent:永久表空間
2)undo: 撤銷表空間
3)temporary:臨時表空間
管理方式:
段和區的管理方式是在建立表空間時確定的
段管理方式有auto和manual兩種,區管理方式有本地管理和字典管理(已淘汰)兩種。

注意:
1)如果system表空間是數據字典管理,其他表空間可以是數據字典管理或者本地管理local(本地)
2)字典管理可以轉換為本地管理,但是對於系統表空間,要求執行一些附加步驟,比較麻煩
SQL>execute dbms_space_admin.tablespace_migragte_to_local('tablespacename');
基本操作:
1)創建表空間:
sql>create tablespace test datafile '/data/oracle/oradata/orcl/test01.dbf' size 10m;
這里可以利用oracle提供的dbms_metadata.get_ddl包看看缺省值都給的是什么?
SQL>set serverout on; SQL> declare aa varchar2(2000); begin select dbms_metadata.get_ddl('TABLESPACE','TEST') into aa FROM dual; dbms_output.put_line(aa); end; / 2 3 4 5 6 7
結果: CREATE TABLESPACE "TEST" DATAFILE '/data/oracle/oradata/orcl/test01.dbf' SIZE 10485760 LOGGING ONLINE PERMANENT BLOCKSIZE 8192 EXTENT MANAGEMENT LOCAL AUTOALLOCATE DEFAULT NOCOMPRESS SEGMENT SPACE MANAGEMENT AUTO ##關注最后一行,兩個重要信息是:(1)區本地管理且自動分配空間,(2)段自動管理。
PL/SQL procedure successfully completed. SQL>
2)刪除表空間
SQL>drop tablespace 表空間名 including contents and datafiles;
contents:包括控制文件和數據字典信息,
datafiles:這個物理文件
數據庫在open狀態的時候不能刪除如下表空間:
1.system 2.active undo tablespace 3.default temporary tablespace 4.default tablespace
數據庫在open狀態的時候不能offline的表空間的是:
1.system 2.active undo tablespace 3.default temporary tablespace
3)常用的查表空間命令
1.查看表空間大小 SQL> select TABLESPACE_NAME,sum(bytes)/1024/1024 from dba_data_files group by tablespace_name; 2.查看表空間空閑大小 SQL> select TABLESPACE_NAME,sum(bytes)/1024/1024 from dba_free_space group by tablespace_name; 3.查看表空間(數據文件)是否是自動擴展 SQL> col file_name for a40; SQL> select file_name,tablespace_name,bytes/1024/1024 mb,autoextensible from dba_data_files;
4)建立大文件的表空間
small file:在一個表空間中可以建立多個數據文件(默認)
bigfile:在一個表空間中只能建立一個數據文件(該數據文件最大可達32T),簡化對數據管理
SQL> create bigfile tablespace big_tbs datafile '/u01/oradata/prod/bigtbs01.dbf' size 100m; 試圖在該表空間下增加一個數據文件會報錯 SQL> alter tablespace big_tbs add datafile '/u01/oradata/prod/bigtbs02.dbf' size 100m; 報錯:ORA-32771: cannot add file to bigfile tablespace 查看大文件表空間: SQL> select name,bigfile from v$tablespace;
大文件表空間
優勢:
-減少數據庫的數據文件個數(每個數據庫64個數據文件)
-方便文件管理,不需要人工干預表空間的文件大小
-減少數據庫對文件頭同步開銷
3.segment(段)
在oracle中,凡是被分配了空間的對象,都稱之為段。
特點:
1)表空間在邏輯上可以對應多個段,物理上是對應的是多個數據文件,一個段比較大時可以跨多個數據文件。
2)創建一個表,oralce會為表創建一個(或多個)段,在一個段中保存該表的所有表數據(表數據不能跨段)
3)段中至少有一個初始區,當這個段數據增加使得區(extent)不夠時,將為這個段分配新的后續區。
臨時段:
1)臨時段也叫臨時表空間,一般用作排序,(hash,merge... 需要一個中間數據處理區域,)
2)只要當oracle內存不夠時,oracle才會在臨時表空間上創建臨時段
3)臨時段上的操作並不會記錄redo log
臨時表:
1)Oracle臨時表只存在於某個會話或者事務的生命周期里,此時臨時表的數據只對這個會話可見。
2)臨時表經常被用於存放一個操作的中間數據(數據的中間處理環節)
3)臨時表由於不產生redo,故能提高數據操作性能。
4)臨時表上也是可以創建索引的
創建臨時表:
語法:
create global temporary 臨時表名 on commit delete rows
on commit delete row:臨時表中的數據基於事務的,當事務提交或者回滾時,臨時表中的數據將被清空
on commit preserve row:臨時表中的數據基於回話,當回話結束后,臨時表中的數據被清空了
段壓縮:
1) oracle允許對段進行壓縮
2)優點:1.減少存儲空間,2.減少處理數據塊(減少內存占用、提高io速度、提高查詢效率)
3)缺點:因為要額外地對數據進行處理,在數據插入時,會消耗更多的資源和時間
語法:
>create table 表名 compress as select * from dba_objects; ##設置壓縮
>alter table 表名 nocompress ##取消壓縮
段壓縮級別:
1)表空間級別 2)表級(索引) 3)分區 4)子分區
表空間級別:
>create table 表名 tablespace 表空間名 as select * from dba_objects; ##這里的表空間是已經壓縮過了的,然后再在這個表空間中創建表
>select table_name,compression from user_tables where table_name='表名‘;
段的管理方式:
1)自動管理方式:簡稱ASSM(Auto segment space management) 采用位圖管理段的存儲空間
簡單說就是每個段的段頭都有一組位圖(5個位圖),位圖描述每個塊的滿度,根據滿度的不同將每個塊登記到相應的位圖上,位圖自動跟蹤每個塊的使用空間(動態),5個位圖的滿度按如下定義:滿度100%,75%、50%、25%和0%,比如塊大小為8k,你要插入一行是3k的表行,那么oracle就給你在滿度50%的位圖上找個登記的可插入的塊。減少熱點;
ASSM的前提是EXTENT MANAGEMENT LOCAL,在ORACLE9I以后,缺省狀態為自動管理方式,ASSM廢棄pctused屬性。
自動段管理優缺點:
優點:
-簡化管理,ASSM避免了手動設置參數大量的存儲相關的參數,除了唯一的一個uctfree
-增大並發度,如果有多個事務並發方位一個段,對於MSSM,由於使用freelist列表進行空間管理,導致大量的會話訪問這些列表,出現資源的等待和爭用,ASSM由於不使用freelist方式管理空間,會有效避免資源哦爭用和等待。
-Rac模式下可以改善並發性能(不需要各個實例間相互訪問大量的freelist列表)
缺點:
-FTS(全表掃描)
-大數據的加載,會導致性能下降
-影響索引的集群因子(clustering factor)
2) 手動管理方式:簡稱MSSM(manual segment space management) 采用的是freelist(空閑列表)管理段的存儲空間。
原理是:這時傳統的方式,現在也在使用,涉及三個概念:freelist、pctfree、pctused.
freelist:空閑列表中登記了可以插入數據的可用塊,位置在段頭,插入表行數據時首先查找該列表。
pctfree:用來為一個塊保留的空間百分比,以防止在今后的更新操作中增加一列或多列值的長度。達到該值,從freelist清除該塊信息
pctused:一個塊的使用水位的百分比,這個水位將使該塊返回到可用列表中去等待更多的插入操作。達到該值,該塊信息登錄到freelist
pctused這個參數在ASSM下不使用,ASSM使用位圖狀態位取代了pctused.

3)創建MSSM對象
SQL>create tablespace ts_mssm segment space management manual; SQL>create table t_m(id int) pctfree 20 pctused 20 storage(freelist 20 next 5M) tablespace ts_mssm;
SQL>select pct_free,pct_used,freelists from user_tables where table_name='T_M'; ##查看相關信息
4)手動段管理特點
優點:1.給與DBM更大的空間管理余地 2.對於一些數據塊操作非常敏感的場景依然有用。
缺點:1.參數設置多. 2.參數設定值困難 3.需要更高水平的DBA
.
