一、管理表的準則
?
??? 1、創(chuàng)建表之前的設(shè)計
?
??? 一般表的結(jié)構(gòu)由應用開發(fā)者負責,數(shù)據(jù)庫管理員負責設(shè)置存儲參數(shù)以及給表定義簇。具體的需要做到:
?
??? ① 表被規(guī)范化
??? ② 每個列具有合適的數(shù)據(jù)類型
??? ③ 最后定義允許空值的列,以便節(jié)約存儲空間
??? ④ 合適的時候?qū)Ρ矸执兀怨?jié)省存儲空間和優(yōu)化SQL語句性能
?
??? 2、指定數(shù)據(jù)塊空間參數(shù)
?
??? 在創(chuàng)建每個表的時候,指定PCTFREE和PCTUSED參數(shù)。
?
??? 3、指定每個表的位置
?
??? 在創(chuàng)建表的時候,都用TABLESPACE子句指定合適的表空間,具體意義有:
?
??? ① 可以提高數(shù)據(jù)庫系統(tǒng)的性能
??? ② 可以減少數(shù)據(jù)庫管理的時間
??? ③ 如果被默認創(chuàng)建在SYSTEM空間,會影響Oracle性能
??? ④ 相關(guān)聯(lián)的表被隨機存儲在多個表空間,則管理操作時間會增加
?
??? 4、考慮并行創(chuàng)建表
?
??? 如果使用CREATE TABLE ... SELECT ...語句來創(chuàng)建表時,盡量使用并行執(zhí)行,這樣由多個進程一起創(chuàng)建表,會改善創(chuàng)建的效率。
?
??? 5、考慮創(chuàng)建時使用NOLOGGING
?
??? 使用NOLOGGING子句可以使創(chuàng)建表時所產(chǎn)生的重做信息量最小,具體好處有:
?
??? ① 節(jié)省了重做日志文件的空間
??? ② 減少了創(chuàng)建表的時間
??? ③ 改善了大表的并行創(chuàng)建的性能
?
??? 注:NOLOGGING子句還指定了不等級后續(xù)的用SQL*Loader和INSERT操作所做的直接加載操作,但是后續(xù)的DML語句不受影響,任然會產(chǎn)生重做登記。
?
??? 6、估計表的大小和設(shè)置存儲參數(shù)
?
??? ① 通過對表、索引、回滾段、重做日志文件的估計,以決定支持期望的數(shù)據(jù)庫所需磁盤空間,購買合適的硬件設(shè)備。
??? ② 估計單個表的大小,以便更好管理該表使用的磁盤空間,以配置合適的存儲參數(shù),改善I/O性能
?
??? 7、規(guī)劃大表
?
??? 可以設(shè)置MAXEXTENTS UNLIMITED來簡單規(guī)劃大表,減少消耗的空間和碎片。具體可以考慮:
?
??? ① 將表和索引分開。放入不同的表空間,甚至不同的磁盤。這樣在重建索引時也可以更容易找到連續(xù)的空間。
??? ② 分配足夠的臨時空間。用于防止排序時臨時空間不夠。
?
??? 注:不能更改數(shù)據(jù)字典來使MAXEXTENTS大于允許的數(shù)據(jù)庫塊的最大值。
?
??? 8、表的限制
?
??? ① 包含對象類型的表不能導入Oracle 8之前的數(shù)據(jù)庫中
??? ② 當原始數(shù)據(jù)還在數(shù)據(jù)庫中時,不能將類型和盤區(qū)表移動到不同的模式中
??? ③ 不能將一個導出的表合并到不同模式中相同名字的表中
??? ④ Oracle對表所能具有的列數(shù)(或?qū)ο箢愋蛯傩?有限制
?
?
二、創(chuàng)建表
?
??? 具體的創(chuàng)建方式,以及表的類型,可以參見“Oracle表介紹”。這里簡單得介紹一下
:
?
??? 1、表創(chuàng)建的格式
?
??? CREATE TABLE emp (
??? empno NUMBER(5) PRIMARY KEY,
??? ename VARCHAR2(15) NOT NULL,
??? job VARCHAR2(10),
??? mgr NUMBER(5),
??? hiredate DATE DEFAULT (sysdate),
??? sal NUMBER(7,2),
??? comm NUMBER(7,2),
??? deptno NUMBER(3) NOT NULL,
??? CONSTRAINT dept_fkey REFERENCES dept)
??? PCTFREE 10
??? PCTUSED 40
??? TABLESPACE users
??? STORAGE?
??? (INITIAL 50K
??? NEXT 50K
??? MAXEXTENTS 10
??? PCTINCREASE 25)
?
??? 2、創(chuàng)建臨時表
?
??? CREATE GLOBAL TEMPORARY TABLE work_area
??? (startdate DATE,
??? enddate DATE,
??? class CHAR(20))
??? ON COMMIT DELETE ROWS;
?
??? 說明:
??? ON COMMIT DELETE ROWS:事務(wù)特殊,提交后舍棄表。
??? ON COMMIT?PRESERVE ROWS:會話特殊,結(jié)束會話時才舍棄表。
?
??? 3、并行創(chuàng)建表
?
??? 可以通過兩種方法來并行創(chuàng)建表:
?
??? ① 在CREATE TABLE .. AS SELECT語句中包含了PARALLEL子句
??? ② 指定了ALTER SESSION FORCE PARALLEL DDL語句
?
??? CREATE TABLE emp_dept
??? PARALLEL
??? AS SELECT * FROM scott.emp
??? WHERE deptno = 10;
?
??? 4、自動收集表上的統(tǒng)計信息
?
??? 在CREATE(ALTER) TABLE語句中,加入MONITORING子句,則會使用DBMS_STATS包來自動收集統(tǒng)計數(shù)據(jù)。
?
??? 可以通過這個包來收集、修改、查看、導出、導入和刪除統(tǒng)計數(shù)據(jù)。所統(tǒng)計的信息可以使用DBA|ALL|USER_TAB_MODIFICATIONS視圖來查看。
?
??? 取消收集用NOMONITORING語句。
?
?
三、更改表
?
??? 可以使用ALTER TABLE語句來更改表。更改表可能處于以下的原因:
?
??? ● 添加、刪除、修改現(xiàn)有的列
??? ● 修改數(shù)據(jù)塊空間的使用參數(shù)(PCTFREE|PCTUSED)
??? ● 修改事務(wù)入口配置(INITRANS|MAXTRANS)
??? ● 修改存儲參數(shù)
??? ● 將表移動到一個新段或表空間
??? ● 明確分配一個盤區(qū)或收回未使用的空間
??? ● 修改表的日志屬性
??? ● 修改CACHE|NOCACHE屬性
??? ● 添加、修改、刪除表的相關(guān)完整性約束
??? ● 啟用、停用表的相關(guān)完整性約束或觸發(fā)器
??? ● 修改表的并行度
??? ● 重命名表
??? ● 添加、修改索引結(jié)構(gòu)表的特征
??? ● 添加、修改LOB列
??? ● 添加、修改對象類型、嵌入的表、Varray列
??? ● 啟動、停用統(tǒng)計數(shù)據(jù)采集(MONITORING|NOMONITORING)
?
??? 下面舉例具體操作語句:
?
??? 1、移動表到一個新段或表空間
?
??? ALTER TABLE emp MOVE
??? STORAGE
??? (
INITIAL 20K
?????NEXT 40K
???? MINEXTENS 2
???? MAXEXTENS 20
???? PCTINCREASE 0);
?
??? 2、手動給表分配存儲空間
?
??? 使用ALTER TABLE語句中的ALLOCATE EXTENT子句來分配新盤區(qū)
??? 使用ALTER TABLE語句中的DEALLOCATE UNUSED子句來明確收回未使用的空間
?
??? 3、刪除列
?
??? ALTER TABLE emp DROP COLUMN sal;
??? ALTER TABLE emp DROP (sal,comm);
?
??? 注:不能刪除所有的列,不能刪除SYS擁有的表的列。
?
??? 4、標記未使用且刪除
?
??? ALTER TABLE emp SET UNUSED (sal,comm);
?
??? 注1:標記未使用的列在查詢和數(shù)據(jù)字典視圖中均不顯示,新建列可以使用改名字,且相關(guān)的約束、索引、統(tǒng)計數(shù)據(jù)均被刪除。
??? 注2:DBA|ALL|USER_UNUSED_COL_TABS視圖中列出所有包含未使用列的表,以及未使用列的個數(shù)。
?
??? 使用以下語句來刪除標記為未使用的列:
?
??? ALTER TABLE emp DROP UNUSED COLUMNS;
?
?
?
?
-The End-