Table的學習 ①
?
??? 又要學習Table了,其實每次學習都會有一些不同的收獲。在這本教材里,主要偏重于對對創建Table時的一些邊邊角角的內容的詳細介紹,所以只要能夠完全掌握這篇文章,基本上對于Table的理解就可以更進一層。至于那些普通的管理操作,都是浮云。
?
一、管理表的準則
?
??? 1、創建表之前的設計
?
??? 一般表的結構由應用開發者負責,數據庫管理員負責設置存儲參數以及給表定義簇。具體的需要做到:
?
??? ① 表被規范化
??? ② 每個列具有合適的數據類型
??? ③ 最后定義允許空值的列,以便節約存儲空間
??? ④ 合適的時候對表分簇,以節省存儲空間和優化SQL語句性能
?
??? 2、指定數據塊空間參數
?
??? 在創建每個表的時候,指定PCTFREE和PCTUSED參數。
?
??? 3、指定每個表的位置
?
??? 在創建表的時候,都用TABLESPACE子句指定合適的表空間,具體意義有:
?
??? ① 可以提高數據庫系統的性能
??? ② 可以減少數據庫管理的時間
??? ③ 如果被默認創建在SYSTEM空間,會影響Oracle性能
??? ④ 相關聯的表被隨機存儲在多個表空間,則管理操作時間會增加
?
??? 4、考慮并行創建表
?
??? 如果使用CREATE TABLE ... SELECT ...語句來創建表時,盡量使用并行執行,這樣由多個進程一起創建表,會改善創建的效率。
?
??? 5、考慮創建時使用NOLOGGING
?
??? 使用NOLOGGING子句可以使創建表時所產生的重做信息量最小,具體好處有:
?
??? ① 節省了重做日志文件的空間
??? ② 減少了創建表的時間
??? ③ 改善了大表的并行創建的性能
?
?? 注:NOLOGGING子句還指定了不等級后續的用SQL*Loader和INSERT操作所做的直接加載操作,但是后續的DML語句不受影響,任然會產生重做登記。
?
??? 6、估計表的大小和設置存儲參數
?
??? ① 通過對表、索引、回滾段、重做日志文件的估計,以決定支持期望的數據庫所需磁盤空間,購買合適的硬件設備。
??? ② 估計單個表的大小,以便更好管理該表使用的磁盤空間,以配置合適的存儲參數,改善I/O性能
?
??? 7、規劃大表
?
??? 可以設置MAXEXTENTS UNLIMITED來簡單規劃大表,減少消耗的空間和碎片。具體可以考慮:
?
??? ① 將表和索引分開。放入不同的表空間,甚至不同的磁盤。這樣在重建索引時也可以更容易找到連續的空間。
??? ② 分配足夠的臨時空間。用于防止排序時臨時空間不夠。
?
??? 注:不能更改數據字典來使MAXEXTENTS大于允許的數據庫塊的最大值。
?
??? 8、表的限制
?
??? ① 包含對象類型的表不能導入Oracle 8之前的數據庫中
??? ② 當原始數據還在數據庫中時,不能將類型和盤區表移動到不同的模式中
??? ③ 不能將一個導出的表合并到不同模式中相同名字的表中
??? ④ Oracle對表所能具有的列數(或對象類型屬性)有限制
?
?
二、創建表
?
??? 具體的創建方式,以及表的類型,可以參見“Oracle表介紹”。這里簡單得介紹一下
:
?
??? 1、表創建的格式
?
??? 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、創建臨時表
?
??? CREATE GLOBAL TEMPORARY TABLE work_area
??? (startdate DATE,
??? enddate DATE,
??? class CHAR(20))
??? ON COMMIT DELETE ROWS;
?
??? 說明:
??? ON COMMIT DELETE ROWS:事務特殊,提交后舍棄表。
??? ON COMMIT PRESERVE ROWS:會話特殊,結束會話時才舍棄表。
?
??? 3、并行創建表
?
??? 可以通過兩種方法來并行創建表:
?
??? ① 在CREATE TABLE .. AS SELECT語句中包含了PARALLEL子句
??? ② 指定了ALTER SESSION FORCE PARALLEL DDL語句
?
??? CREATE TABLE emp_dept
??? PARALLEL
??? AS SELECT * FROM scott.emp
??? WHERE deptno = 10;
?
??? 4、自動收集表上的統計信息
?
??? 在CREATE(ALTER) TABLE語句中,加入MONITORING子句,則會使用DBMS_STATS包來自動收集統計數據。
?
??? 可以通過這個包來收集、修改、查看、導出、導入和刪除統計數據。所統計的信息可以使用DBA|ALL|USER_TAB_MODIFICATIONS視圖來查看。
?
??? 取消收集用NOMONITORING語句。
?
?
三、更改表
?
??? 可以使用ALTER TABLE語句來更改表。更改表可能處于以下的原因:
?
??? ● 添加、刪除、修改現有的列
??? ● 修改數據塊空間的使用參數(PCTFREE|PCTUSED)
??? ● 修改事務入口配置(INITRANS|MAXTRANS)
??? ● 修改存儲參數
??? ● 將表移動到一個新段或表空間
??? ● 明確分配一個盤區或收回未使用的空間
??? ● 修改表的日志屬性
??? ● 修改CACHE|NOCACHE屬性
??? ● 添加、修改、刪除表的相關完整性約束
??? ● 啟用、停用表的相關完整性約束或觸發器
??? ● 修改表的并行度
??? ● 重命名表
??? ● 添加、修改索引結構表的特征
??? ● 添加、修改LOB列
??? ● 添加、修改對象類型、嵌入的表、Varray列
??? ● 啟動、停用統計數據采集(MONITORING|NOMONITORING)
?
??? 下面舉例具體操作語句:
?
??? 1、移動表到一個新段或表空間
?
??? ALTER TABLE emp MOVE
??? STORAGE
??? (
INITIAL 20K
???? NEXT 40K
???? MINEXTENS 2
???? MAXEXTENS 20
???? PCTINCREASE 0);
?
??? 2、手動給表分配存儲空間
?
??? 使用ALTER TABLE語句中的ALLOCATE EXTENT子句來分配新盤區
??? 使用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:標記未使用的列在查詢和數據字典視圖中均不顯示,新建列可以使用改名字,且相關的約束、索引、統計數據均被刪除。
??? 注2:DBA|ALL|USER_UNUSED_COL_TABS視圖中列出所有包含未使用列的表,以及未使用列的個數。
?
??? 使用以下語句來刪除標記為未使用的列:
?
??? ALTER TABLE emp DROP UNUSED COLUMNS;
?
?
?
?