無論是資料庫管理員,還是普通用戶,都需要經常對資料庫對象進行管理,如資料庫對象的創建、刪除、修改等。Oracle 中的資料庫對象包括表、索引、視圖、存儲程式、序列等,這些資料庫對象以一種邏輯關係組織在一起,這就是模式( schema )。模式是一個用戶所擁有的所有資料庫對象的集合。 每個資料庫對象都 ...
無論是資料庫管理員,還是普通用戶,都需要經常對資料庫對象進行管理,如資料庫對象的創建、刪除、修改等。
Oracle 中的資料庫對象包括表、索引、視圖、存儲程式、序列等,這些資料庫對象以一種邏輯關係組織在一起,這就是模式( schema )。
模式是一個用戶所擁有的所有資料庫對象的集合。
每個資料庫對象都屬於某個用戶,一個用戶所擁有的資料庫對象就組成了一個模式,模式的名稱與用戶名相同。
當創建用戶時,就同時產生了一個模式,在預設的情況下,用戶在自己的模式中有所有的許可權。
將站在資料庫管理員的角度,重新考慮這些資料庫對象在Oracle 中所涉及的特性,如存儲結構、數據的組織方式等。
表的管理
表的管理涉及表的結構、表的創建、修改與刪除等操作,以及臨時表、分區表和索引組織表三種特殊類型的表。
表的結構
在資料庫中,表是最基本的資料庫對象,用來存儲系統或用戶的數據。
表中的數據是按照行和列的格式存放的。
表中的各行數據一般以寫入的先後順序存放,而一行中的各列一般按照定義表時指定的順序存放的。
在邏輯結構上,一個表位於某個表空間。
當創建一個表時,將同時創建一個表段,用於存放表中的數據。
在物理結構上,表中的數據都存放在數據塊中,因而在數據塊中存放的是一行行的數據。
圖為數據塊中一行數據的結構。
其中行的頭部記錄了該行中列的個數、行間的全連接、加鎖信息等。
列長度記錄-個列實際占用的位元組數,而列值則記錄了該列實際存放的數據。
表中的每一行數據都有一個行號,用於標識該行數據的物理位置。
根據這個行號,可以直接定位該行數據。
行號可以通過偽列ROWID獲得。
例如,以下查詢得到表DEPT中的數據及每行的行號。
SELECT rowid, emp.* FROM scott.emp;
行號是由資料庫伺服器自動生成的字元串,包含18個字元。
行號的組成如圖所示。
其中前六個字元表示資料庫對象的編號,用來指定該行數據屬於哪個資料庫對象。
在資料庫中每個資料庫對象都有一個唯一的編號。
從第七個到第九個共三個字元表示數據文件的相對編號,用來指定該行數據存儲在哪個數據文件中。
在資料庫中每個數據文件中有兩個編號,一個是絕對編號,它是數據文件在整個資料庫範圍內的編號,另一個是相對編號,它是數據文件在一個表空間範圍內的編號。
從第十到第十五共六個字元表示數據塊的編號,用來指定該行數據位於哪個數據塊中。
最後三個字元表示行號,用來指定該行數據在數據塊中位於第幾行。
為了使用戶對行號的進行解析, Oracle提供了一個DBMS_ROWID程式包,利用這個程式包中的函數可以對行號進行分析。
DBMS_ROWID 中各個函數的用法如表所示。
例如,以下查詢將得到dept表中每行數據所在的文件編號、資料庫對象的編號、數據塊編號和在數據塊中的行號:
SELECT DBMS_ROWID.ROWID_RELATIVE_FNO(rowid) AS 相對文件號,
DBMS_ROWID.ROWID_OBJECT(rowid) AS 對象編號,
DBMS_ROWID.ROWID_BLOCK_NUMBER(rowid) AS 數據塊編號,
DBMS_ROWID.ROWID_ROW_NUMBER(rowid) AS 行號
FROM scott.dept;
表的創建
在創建表時,可以同時為表指定一些重要的屬性,如存儲參數、所屬表空間等。
這些屬性都通過CREATE TABLE命令的子句指定。
1.PCTFREE和PCTUSED子句
這兩個參數的作用是用來控制數據塊的空間使用情況。
為了減少數據塊間的遷移,在創建表時可以通過PCTFREE和PCTUSED子句指定數據塊空間的使用情況。
考慮以下創建表的語句:
CREATE TABLE Tl(
name varchar2 ( 10) )
PCTFREE 20
PCTUSED 40;
在表Tl 中,每個數據塊都有20o/o的保留空間。
當可用空間使用完後,新的數據將被寫入另外一個數據塊。
當從表中刪除數據時,數據塊中已用空間不斷減少,當減少到40%時,可再次向該數據塊中插入數據。
在使用PCTFREE和PCTUSED子句時,可以參考以下原則:
• PCTFREE和PCTFUSED的值必須小於或等於100% 。
·如果在一個表上很少執行UPDATE操作,可以將PCTFREE設置得儘量小。
• PCTFREE與PCTUSED之和越接近100o/o ,數據塊的空間利用率越高。
2.TABLESPACE子句
TABLESPACE子句用來指定將表創建在哪個表空間上。
如果不指定TABLESPACE子句,用戶將在自己的預設表空間上創建表。
為了能夠在指定的表空間上創建表,當前用戶必須在該表空間上有足夠的空間配額或在資料庫中具有UNLIMITED TABLESPACE許可權。
3.INITRANS和MAXTRANS子句
資料庫中的數據存儲在數據塊中,用戶的事務最終要修改數據塊中的數據。
Oracle允許多個併發的事務同時修改一個數據塊中的數據。
每當用戶的事務開始作用於一個數據塊時,資料庫伺服器將在該數據塊的頭部為該事務分配一個事務項,以記錄事務的相關信息。
事務結束時,對應的事務項將被刪除。
INITRANS和MAXTRANS參數用於控制一個數據塊上的併發事務數量,其中INITRANS 用於指定初始的事務數量。
MAXTRANS 用於指定最大的併發事務數量。
當創建一個表時,資料庫伺服器按照INITRANS的值為每個數據塊分配一定的事務項,這些事務項將一直保留到該表被刪除。
當一個事務訪問數據塊時,將占用其中的一個事務項,事務結束時,將釋放事務項。
當這些預先創建的事務項全部被占用後,如果又有新的併發事務發生,資料庫伺服器將在數據塊的可用空間中為事務創建一個新的事務項。
在任一時刻,數據塊中的事務項不會超過MAXTRANS 參數值。
例如,在利用以下語句創建表時,指定初始的事務項為10 ,最大的併發事務數量為2000
CREATE TABLE T2(
name varchar2 ( 10) )
INITRANS 10
MAXTRANS 200;
INITRANS和MAXTRANS參數的值可以根據用戶對錶的訪問情況進行設置。
如果參數值過大,事務項將占用更多的數據塊空間,那麼數據可以利用的空間將喊少。
如果參數設置過小,有些事務將因為無法分配到事務項而等待,從而降低了資料庫的性能。
一般情況下,如果多個用戶同時訪問表的情況很少發生,可以為這兩個參數設置較小的參數值,反之要為這兩個參數指定較大的參數值。
4.CACHE子句
CACHE子句用於指定將表中的數據放在資料庫高速緩存中,並保留一段時間。
如果在創建表時指定了CACHE字句,那麼在用戶第一次訪問表中的數據時,這個表將整個被讀到資料庫高速緩存中,並保留較長的一段時間,這樣用戶以後再訪問該表時,可直接訪問資料庫高速緩存中的數據,從而提高訪問的效率。
在預設情況下創建表時使用NOCACHE子句。
對於一些較小的、用戶訪問頻繁的表,在創建時可以考慮使用CACHE子句,以提高訪問效率。
CREATE TABLE T3(
name varchar2 ( 10) )
CACHE;
5.RAPALLEL子句
在一般情況下,通過INSERT命令向表中寫人數據時,一次寫入一行數據,這樣的寫操作是串列進行的。
如果在創建表時指定了PARALLEL子句,那麼在向表中以批量方式寫入大量數據時就是以併發方式進行的,這樣可以大大提高處理的速度。
例如,利用以下語句創建表時,將實現併發操作。
CREATE TABLE T4(
name varchar2 ( 10) )
PARALLEL;
如果不希望在表上以併發方式寫入數據,在創建表時需要指定NOPARALLEL 。
6.LOGGING子句
在預設情況下,用戶在表上執行DDL和DML命令時,伺服器進程都會產生重做日誌。
如果不希望產生重做日誌,在創建表時需要指定NOLOGGING子句。
使用NO LOGGING子句有以下好處:
·由於不寫重做日誌,因而節約了重做日誌文件的存儲空間。
.減少了處理時間。
·在以並行方式向表中寫入大量數據時提高了效率。
當然在使用NOLOGGING子句時也有不好的一面。
因為沒有重做日誌,當表被破壞時,將無法進行恢復,所以在表創建後應該及時對其進行備份。
CREATE TABLE T5(
name varchar2 ( 10) )
NOLOGGING;
7.COMPRESS子句
如果在創建表時使用了COMPRESS子句,那麼一個數據塊中兩行完全相同的數據將被壓縮為一行,並存儲在數據塊的開始,在數據塊中本應存儲這兩行數據的地方只存儲該行數據的引用。
使用表的壓縮功能可以減少表所占用的存儲空間和資料庫高速續存空間,並且可以提高查詢速度。
表的壓縮功能一般用在向表中批量插入數據的情況(例如基於查詢創建表)。
一個表中可以包含壓縮的和未壓縮的數據,所有DML操作均可應用於這些壓縮的數據。
例如,下麵的語句用於創建表T6,這個表具有壓縮功能,支持併發的數據寫入,對DDL和DML命令不產生重做日誌。
CREATE TABLE T6(
name varchar2 ( 10) )
COMPRESS PARALLEL NOLOGGING;
臨時表是一種特殊類型的表,表中的數據並不永久保存,而是一些臨時數據。
這些臨時數據只在當前事務或當前會話中有效,當事務或會話結束時,這些臨時數據將被全部刪除。
創建臨時表的命令是CREATE GLOBAL TEMPORARY TABLE 。
在創建臨時表時還需要通過ON COMMIT子句指定臨時數據的有效範圍。
如果指定了ON COMMIT DELETE ROWS 子句,那麼臨時表是事務級的,當事務提交或回滾時,臨時表中的數據即被刪除。
如果指定了ONCOMMIT PRESERVE ROWS子句,那麼臨時表是會話級的,表中的數據將一直保留,直到當前會話結束時才被刪除。
以下語句用於創建一個事務級的臨時表:
CREATE GLOBAL TEMPORARY TABLE T7(
name varchar2(10)
ON COMMIT DELETE ROWS;
表的修改
在資料庫伺服器的運行過程中,如果發現表的設計不合理,可以對其進行修改。
一般來說,對錶的修改涉及以下內容:
·表的結構的修改,如增加列、刪除列、修改某個列的定義。
·約束的修改,如添加約束、刪除約束、激活約束與禁止約束。
·修改表的物理屬性,如PCTFREE參數、PCTUSED參數。
·表的移動,如移動到一個新的數據段或表空間。
·表的存儲空間的手工分配和回收。
修改表的命令是ALTER TABLE ,普通用戶只能修改自己的表。
如果要修改其他用戶的表,必須具有ALTER ANY TABLE系統許可權。
1.修改表的物理屬性
在創建表時可以指定PCTFREE 、PCTUSED 、INITRANS 、CACHE等參數,這些參數對於表中存儲空間的利用有直接的影響。
表在創建以後,用戶也可以對這些參數進行修改。
例如,下麵的語句對錶的參數進行了修改:
ALTER TABLE T6 NOLOGGING;
2.表的移動
表的移動意味著把表中的數據移動到一新的表段中,同時可以把表段移動到另外一個表空間中。
表的移動在以下場合非常有用:
·消除表中的存儲碎片。
·消除表中數據塊間的鏈接。
·把表移動到另外-個表空間中。
.修改表所使用的數據塊大小。
在對錶進行移動時,表中的數據將被重新排列,這樣就可以消除表中的存儲碎片和數據塊的鏈接。
如果兩個表空間所使用的數據塊大小不同,那麼表在兩個表空間中移動時,也將使用不同大小的數據塊。
移動表所使用的命令是ALTER TABLE 。
在移動表時,先為表創建一個新的表段,然後把表中的數據移動到這個新段中,最後刪除原來的表段。
例如:
ALTER TABLE T2 MOVE;
又如, 下麵的ALTER語句用於把表T2移動到表空間USERS中:
ALTER TABLE T2 MOVE TABLESPACE USERS;
需要註意的是,表被移動後,表的行號將發生變化,所以表上原來的索引將不可用。
在表移動後應該刪除原來的索引並重新創建。
存儲空間的手工分配和回收
表在創建後,隨著數據的增加, Oracle將按照存儲參數的設置不斷為表分配新的區。
這一過程是自動進行的,不需要用戶的干預。
在布些情況下,用戶希望為表分配一個指定大小的區,這時需要利用ALTER TABLE命令及其ALLOCATE EXTENTS子句為表手工分配一個區。
在手工為表分配區時,可以為其指定大小。
如果沒有指定大小,資料庫伺服器將按照該表所在表空間的區大小,為表分配一個區。
例如,以下語句為表T2手工分配了一個512KB 的區:
ALTER TABLE T2 ALLOCATE EXTENT(SIZE 521K);
實際上,手工指定的區大小與該表所在表空間的區大小可能不一致。
假設表空間的區大小是64KB ,那麼上述命令的執行結果是為表T2分配了8個64KB 的區。
在表段的HWM以下,可能有一些尚未使用的數據塊。
為了節省磁碟空間,可以通過命令把這些存儲空間回收。
例如:
ALTER TABLE T2 DEALLOCATE UNUSED;
表的刪除
當一個表不需要時,可以將其刪除。
刪除表時,將產生以下結果:
·表的結構信息從數據字典中被刪除,表中的數據不可訪問。
·表上的所有索引和觸發器被一起刪除。
·所有建立在該表上的同義詞、視圖和存儲程式變為無效。
·所有分配給表的區被標記為空閑,可被分配給其的對資料庫對象。
一般情況下,普通用戶只能刪除自己的表。
若希望刪除其他用戶的表,則必須具有DROP ANY TABLE系統許可權。
為了防止用戶對錶進行誤刪除,在資料庫中提供了一個回收站。
當表被刪除時,表所占用的存儲空間並不是立即被釋放,而是被放進了回收站。
回收站實際上是一個數據字典表,用於記錄被刪除的表、索引等資料庫對象的信息。
當一個資料庫對象被刪除時,它所占用的存儲空間並不立即釋放,而是被重命名後放進了回收站。
如果後來用戶發現某個對象是被誤刪除的,可以從回收站中將其恢復。
當用戶刪除一個表空間時,表空間中的資料庫對象並不被放入回收站,而且回收站中原來屬於該表空間的資料庫對象也將被清除。
當一個用戶被刪除時,屬於這個用戶的資料庫對象也不被放入回收站,而且回收站中原來屬於該用戶的資料庫對象也將被清除。
用戶可以在回收站中查看屬於自己的、被刪除的資料庫對象,資料庫管理員可以查看所有被刪除的資料庫對象。
用戶可以通過以下的語句查看回收站中的內容:
SELECT * FROM RECYCLEBIN;
資料庫對象被刪除後,它將被重命名並放入回收站。
重命名的目的是為了防止被刪除對象的名稱相互衝突。
重命名的規則為:
BIN$id$ 版本
其中id是由oracle產生的包含26個字元的字元串,是被刪除資料庫對象的唯一標識。
版本是由資料庫伺服器自動指定的版本號。
為了查看回收站的方便, Oracle資料庫提供了兩個數據字典視圖:
USER_RECYCLEBIN :包含當前用戶的被刪除的資料庫對象, RECYCLEBIN是它的同義詞。
DBA_RECYCLEBIN :包含所有被刪除的資料庫對象,僅資料庫管理員可以訪問。
例如,以下語句用於查詢SCOTT用戶被刪除的資料庫對象:
SELECT OBJECT_NAME, ORIGINAL_NAME FROM DBA_RECYCLEBIN WHERE OWNER='SCOTT';
用戶也可以通過執行SQL*Plus命令show recyclebin來查看回收站。
儘管表已經被放入回收站,用戶還是可以訪問表中的數據,只是表名必須使用它在回收站中的名稱。
例如:
SELECT * FROM "BIN$dyeDMxzWSkqrFCX6+dTO2A==$0";
當用戶確信一個資料庫對象不再需要時,可以執行PURGE命令將其從回收站中清除,該對象及其相關對象所占用的存儲空間將一起被釋放。
清除資料庫對象時,可以使用回收站中的名稱,也可以使用被刪除前的名稱。
例如,以下兩條語句的作用都是從回收站中清除表T2:
PURGE TABLE "BIN$dyeDMxzWSkqrFCX6+dTO2A==$0";
PURGE TABLE TEST;
如果希望在刪除表的同時釋放存儲空間,可以在DROP TABLE命令中使用PURGE子句,這個表就直接被刪除了,而不是被放到回收站中。
例如:
DROP TABLE TEST PURGE;
用戶還可以選擇清除回收站中原來屬於某個表空間的所有資料庫對象,或者清除某個用戶的原來屬於某個表空間的所有資料庫對象,還可以清除屬於自己的資料庫對象。
這三種操作對應的命令格式分別為:
PURGE TABLESPACE USERS;
PURGE TABLESPACE USERS USER SCOTT;
PURGE RECYCLEBIN;
對於第三種用法,資料庫管理員可用來清除回收站中的所有內容,只是要將RECYCLEBIN替換為DBA_RECYCLEBIN。
如果一個資料庫對象被刪除了,那麼在被從回收站中清除之前,可以通過執行FLASHBACK命令將其恢復,並可通過RENAME子句為其指定一個新的名稱。
例如:
FLASHBACK TABLE TEST TO BEFORE DROP RENAME TO TEST_BAK;
如果沒有通過RENAME子句為它指定名稱,·它將使用原來的名稱。