Oracle資料庫中,表,索引,預存程序,函數等都是對象。
schema 的名稱與使用者名稱相同,但是與使用者不是同一回事,如果使用者沒有任何對象,則schema就不存在。
一、表
ORACLE表分四類:
普通表 --- 一個表對應一個segment
分區表 Partition Table 虛擬表,沒有對應的segment
索引組織表 Index Organized Table 簡稱 IOT 虛擬表
簇表 --- 虛擬表 首先建立一個簇,一個簇對應一個segment
1、普通表
1)tablespace部分 設定表的logging屬性, Yes 表示對錶DML操作產生重做條目, No 不產生。
2)Extents部分, 設定Initial size
3)Space Usage部分,設定PCTFREE ,預設10 ,表示資料區塊可用空間低於10%以後,資料區塊就不允許insert。PCTUSED 表示什麼情況下可以被insert,預設40%,表示
當資料區塊使用空間低於40%以後,該資料區塊就可以再被insert。啟用ASSM,就不能設定PCTUSED.
2、rowid 是一個偽列,每一條記錄都有rowid偽列。
對應ORACLE10g 來說,rowid 格式:OOOOOOFFFBBBBBBRRR
OOOOOO:資料行所在的對象號
FFF :資料行所在的相對檔案號
BBBBBB:資料行所在的資料區塊號
RRR :資料行所在的資料區塊中的行號
rowid採用64進位,即:A~Z a~z 0~9 / + 64個字元來表示。
A~Z :0~25
a~z :26~51
0~9 :52~61
/ :62
+ :63
例子 rowid = AAAM0hAAEAAAAGnAAA
SQL>select object_id from user_objects where object_name = 'BOOKS'; --對象號
SQL>select dbms_rowid.rowid_relative_fno(rowid) as "File No" from dual; --檔案號
SQL>select dbms_rowid.rowid_block_number(rowid) as "File No" from dual; --塊號
SQL>select dbms_rowid.rowid_row_number(rowid) as "File No" from dual; --行號
3、管理普通表
1)擴充表:有時需要主動擴充表佔用空間,或者將表資料分布到多個檔案,將表的I/O分散到多個磁碟上。
SQL>alter table books allocate extent (size 1M datafile '/u01/app/oracel/oradata/ora10g/users02.dbf');
2)重整表 --消除幣表的資料區塊層級的片段。
稀疏表產生的原因:該表存在很多的insert 和 delete、
在表的segment header裡面,記錄了一個值,叫高水位標誌(High Water Mark 簡稱HWM)表示當前segment 使用最後一個資料區塊的位置。
說明:表進行刪除資料後,HWM位置不會改變,在對錶進行全表掃描時,仍然要掃描到HWM為止。ORACLE10g之前使用move或者匯出匯入的方式進行重整表來減小WHM,如下:
SQL>alter table books move tablespace example; --把表移到example資料表空間,如果沒有加資料表空間,就在當前表對應資料表空間重整,重整後全表索引失效。
ORACLE 10g 可以使用shrink(收縮)對錶進行收縮。
3)收縮表
條件:表所在的資料表空間必須使用 ASSM (自動段空間管理)
收縮表引起資料行在不同的資料區塊轉移,必須啟用 row movement 選項
SQL>alter table t enable row movement;
收縮表語句:
SQL>alter table t shrink space compact; --對錶t只進行壓縮階段,不下降HWM
SQL>alter table t shrink space; --對錶t只進行壓縮階段,下降HWM
SQL>alter table t shrink space cascade; --對錶t只進行壓縮階段,下降HWM;同時還收縮表t相關的其他segment
說明:可以使用Segment Advisor 協助哪些segment可以進行收縮。
4)截斷表
truncate 命令是一個DDL命令,最後WHM下降到最低。
SQL>truncate table t;
注意:有些時候截斷一個巨大的表要花費很長的時間,導致表長時間不能使用。再截斷的時候,可以在更新完資料字典以後,不立即釋放全部的資料區塊,但WHM已經下降到最低。
可以在系統比較空閑分多次釋放資料區塊,每次釋放部分空間。命令如下:
SQL>truncate table t1 reuse storage;
SQL>alter table t1 deallocate unused keep 30M; --將表t1沒有用的資料區塊釋放,釋放到剩餘的表所佔用的空間為30M為止。
SQL>alter table t1 deallocate unused keep 15M;
SQL>alter table t1 deallocate unused keep 0M;
說明:如果其他使用者已經把資料插入t1,則不會刪除,只釋放沒有的資料區塊。
5)刪除表
刪除表屬於DDL命令,只是更新資料字典的資訊,ORACLE不會讀取表包含的資料區塊資訊,因此,即使表處於唯讀資料表空間裡,該表也是可以被刪除的。
SQL>drop table t;
SQL>drop table t cascade constraints;
添加cascade constraints 選項,同時刪除參考資料表 t 的外鍵。
6)修改或刪除列
SQL>alter table t rename column to code;
SQL>alter table t drop column code;
SQL>alter table t drop column code cascade constraints; --同時刪除引用的外鍵
註:在刪除列的過程中,oracle會消耗undo資料表空間,如記錄很多,會消耗過多的undo資料表空間。
SQL>alter table t drop column code cascade constraints checkpoint 2000;
checkpoint 2000 表示每2000條記錄提交一次,從而釋放出undo資源。
註:在刪除列的過程中,oracle會鎖定表,無法對錶進行DML操作,如果資料量很大,則將花費很長時間,在業務高峰期,影響嚴重。
SQL>alter table t set unused column code;
SQL>select * from user_unusedd_col_tabs; ----可以查詢到失效的列。
可以先從邏輯上使該列失效,在業務低峰期在物理上刪除失效的列。
SQL>alter table t drop umused columns;
SQL>alter table t drop umused columns checkpoint 2000;
4、約束 constraints
ORACLE 資料庫裡面,有以下5中約束:
1)非空 not null ---本質上說,not null 屬於 check : col_name is not null
2)唯一 unique
3)主鍵 primary key
4)外鍵 foreign key
5)檢查 check
約束的狀態:
1)enable和disable :對錶進行插入或修改時,對插入或修改後的資料進行檢驗,判斷是否違反約束。
2)validate和novalidate :是否對錶裡已經存在的資料進行檢驗,判斷是否違反約束。
上面的組合存在四種狀態。
SQL>alter table books enable validate constraint pk_books;
SQL>alter table books enable novalidate constraint pk_books;
SQL>alter table books rename constraint pk_books to pk_books_id;
約束校正的時機
延遲約束 deferred constraint :約束在提交的時候進行校正。
1)deferrable :說明約束是否可以被延遲,添加該選項說明可以被延遲。
2)initially deferred 或者 initially immediate:說明約束建立時候,何時校正資料。
initially deferred :提交校正。設定該選項必須設定了deferrable。
initially immediate:預設值,立即校正。
SQL>alter table sales add constraint chk_sales check(price*qty=value) deferrable initially deferred;
SQL>alter session set constraint=deferred;
當發出該語句之後,說明當前session中,對於發出的所有DML語句所涉及的表,只要這些表上約束定義了deferrable選項,這些約束全部延遲檢驗。
5、使用分區表,索引組織表,簇表
Oracle 10g 提供五種分區的方法
1)定界分割 Range Partition
create table t2(id number,createdate date)
partition by range(createdate)
(
partition p1 values less than (to_date('2001-01-01','yyyy-mm-dd')) tablespace ts01,
partition p2 values less than (to_date('2002-01-01','yyyy-mm-dd')) tablespace ts02,
partition p3 values less than (to_date('2003-01-01','yyyy-mm-dd')) tablespace ts03,
partition pmax values less than (maxvalue) tablespace ts04
);
2)雜湊分割 Hash Partition
create table t3(id number,name varchar2(10))
partition by hash(id)
partitions 4
store in (ts01,ts02.ts03.ts04);
create table t3(id number,varchar2(10))
partition by hash(id)
(
partition p1 tablespace ts01,
partition p2 tablespace ts02,
partition p3 tablespace ts03,
partition p4 tablespace ts04
):
3)列表分區 List Partition
create table t4(id number,name varchar2(10),category varchar2(10))
partition by list(category)
(
partition p1 values ('01','02') tablespace ts01,
partition p2 values ('03','04') tablespace ts02,
partition p3 values ('05','06','07') tablespace ts03,
partition p4 values (default) tablespace ts04,
);
4)範圍雜湊組合分區 Range-Hash Partition
create table t5(id,number,name varchar2(10),createdate date)
partition by range (createdate)
subpartition by hash (id)
subpartitions 4 store in (ts01,ts02)
(partition p1 values less than (to_date('2001-01-01','yyyy-mm-dd')),
partition p2 values less than (to_date('2002-01-01','yyyy-mm-dd')),
partition p3 values less than (to_date('2003-01-01','yyyy-mm-dd')),
partition pmax values less than (maxvalue)
subpartitions 2 store in (ts03) );
說明:先按createdate進行定界分割,然後再按照id進行hash分區。預設每個分區包含4個hash子分區,這些子分區都分別在ts01和ts02裡。
也是就是p1,p2,p3都是如此,但對於pmax來說,修改了預設設定,pmax有兩個hash分區,都位於ts03裡。
5)範圍列表組合分區 Range-List Partition
create table t6(id number,name varchar2(10),category varchar2(10),createdate date)
partition by range(createdate)
subpartition by list (category)
(partition p1 values less than (to_date('2001-01-01','yyyy-mm-dd')) tablespace ts01
(subpartition p1_1 values ('01','02'),
subpartition p1_2 values ('03','04'),
subpartition p1_3 values (default) tablespace ts02),
partition p2 values less than (maxvalue) tablespace ts03
(subpartition p1_1 values ('01','02'),
subpartition p1_2 values ('03','04'),
subpartition p1_3 values (default) tablespace ts04)
);
索引組織表 index organized table